为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2019-11-30 13:48:10
我正在使用将文件(“ 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的实现细节


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 602 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信