在Windows中释放Java文件锁定


问题内容

我在使用Java在Windows中删除文件时遇到一些问题。由于某种原因,java会锁定我的文件,但我不知道为什么。这是我的代码:

private byte[] getFileByteArray(File file) {
    try {
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        try {

            ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            byte[] bt = new byte[buffer.remaining()];
            buffer.get(bt);
            channel.close();
            raf.close();
            file.delete();
            return bt;

        } catch (Exception ex) {
            //Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex.toString());
        }

    } catch (FileNotFoundException ex) {
        Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

file.delete()以及在资源管理器中手动尝试拒绝删除该文件,因为它仍在使用中。尽管在Linux中一切似乎都很好。

我在某处缺少close()吗?我可以确认首先使文件成为关闭文件的方法,因为我可以在使用file.delete()运行上述代码之前删除文件。

额外信息: 上面的代码是名为getFileByteArray(File file)的方法的一部分,其调用方式如下:

public byte[] createReport(int id) {

    Report report = new Report();
    String filename = report.CreateReport(id);
    return getFileByteArray(new File(filename));
}

谢谢

更新: 我设法通过使用ByteArrayOutputStream将文件逐字节读入字节数组来解决此问题

如下所述,在Java中存在一个已知的错误,即Windows在文件映射方面存在问题。


问题答案:

这是Windows上Java中的已知错误,请参阅错误#4715154

Sun评估了该问题,并通过以下解释关闭了该错误:

我们无法解决此问题。Windows不允许删除映射文件。一旦我们修复垃圾回收器以更迅速地释放直接缓冲区(请参阅4469299),就应该在某种程度上缓解此问题,但是除此之外,我们无能为力。