如何从使用Java中的FileChannel映射的内存中取消映射文件?

我正在使用将文件(“ 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


HUX布斯
浏览 603回答 3
3回答

烙印99

可以使用以下静态方法:public static void unmap(MappedByteBuffer buffer){   sun.misc.Cleaner cleaner = ((DirectBuffer) buffer).cleaner();   cleaner.clean();}但是由于以下原因,这是不安全的解决方案:1)如果有人在取消映射后使用MappedByteBuffer,则会导致失败2)它依赖于MappedByteBuffer的实现细节
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java