我正在使用将文件(“ sample.txt”)映射到内存FileChannel.map(),然后使用来关闭通道fc.close()。之后,当我使用FileOutputStream写入文件时,出现以下错误:java.io.FileNotFoundException:sample.txt(无法在打开用户映射节的文件上执行请求的操作)File f = new File("sample.txt");RandomAccessFile raf = new RandomAccessFile(f,"rw");FileChannel fc = raf.getChannel();MappedByteBuffer mbf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());fc.close();raf.close();FileOutputStream fos = new FileOutputStream(f);fos.write(str.getBytes());fos.close();我认为这可能是由于即使关闭了文件仍将文件映射到内存FileChannel。我对吗?。如果是这样,如何从内存中“取消映射”文件?(我在API中找不到任何方法)。谢谢。编辑:看起来它(添加了取消映射方法)已作为RFE提交给sun一段时间:http : //bugs.sun.com/view_bug.do?bug_id=4724038
3 回答
烙印99
TA贡献1829条经验 获得超13个赞
可以使用以下静态方法:
public static void unmap(MappedByteBuffer buffer)
{
sun.misc.Cleaner cleaner = ((DirectBuffer) buffer).cleaner();
cleaner.clean();
}
但是由于以下原因,这是不安全的解决方案:
1)如果有人在取消映射后使用MappedByteBuffer,则会导致失败
2)它依赖于MappedByteBuffer的实现细节
添加回答
举报
0/150
提交
取消