在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()somehwhere? 我可以确认首先生成文件的方法是关闭文件,因为我可以在使用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存在文件映射问题。

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

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

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

加上mhaller的回答

并将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. } }