在Windows中释放Java文件锁

时间:2010-11-14 19:16:19

标签: java file-io

我在使用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中似乎都很好。

我错过了一个关闭()的地方吗?我可以确认首先生成文件的方法是关闭文件,因为我可以在使用file.delete()

运行上面的代码之前删除文件。

额外信息:上面的代码是名为getFileByteArray(文件文件)的方法的一部分,并且被调用如下:

public byte[] createReport(int id) {

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

由于

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

如下面提到的海报,Java中存在一个已知的错误,即Windows存在文件映射问题。

2 个答案:

答案 0 :(得分:15)

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

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

  

我们无法解决这个问题。 Windows不允许删除映射文件。这个   一旦我们修复垃圾收集器,问题应该有所改善   更快地解除分配直接缓冲(见4469299),但除此之外   我们无能为力。

答案 1 :(得分:1)

添加到mhaller' answer

sarumont的评论翻译成代码

这个应该 /可以工作。

private static void deleteMappedFilesIfExists(Path path) throws IOException {
    while (true) {
        try {
            Files.deleteIfExists(path);
            break;
        } catch (AccessDeniedException e) {
            System.gc();
        }
        //Add delay if needed.
    }
}