【发布时间】:2010-11-14 19:16:18
【问题描述】:
我在使用 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 框中尝试了此代码,文件仅通过代码被删除
-
@org.life.java,所以你的意思是我上面的代码有效吗?但是在Windows资源管理器中你不能删除它??
-
你能发布你的整个方法以及调用部分
-
编辑主帖以包含完整方法