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

调用java 中的MappedByteBuffer的put方法,是直接写入磁盘么?

调用java 中的MappedByteBuffer的put方法,是直接写入磁盘么?

Qyouu 2019-03-14 18:14:30
RT.想测试下MappedByteBuffer的put方法会不会写入磁盘,如下:FileChannel filechannel=new RandomAccessFile("mydata","rw").getChannel();MappedByteBuffer mappedbytebuffer=filechannel.map(FileChannel.MapMode.READ_WRITE, 0, 10);mappedbytebuffer.put((byte)'a');mappedbytebuffer.put((byte)'b');mappedbytebuffer.put((byte)'c');在每次put的时候加个断点,同时看磁盘上的数据,确实是每次都发生了变化.和预想的不一样,本来以为put不会立刻改变磁盘数据(pagecache), 要用force才能刷到磁盘.这是啥原因?
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

说穿了其实灰常简单了. 你"同时看磁盘上的数据"的时候, 没有绕过操作系统 去查看文件吧? 所以看到的还是 操作系统的文件缓存里的内容. 所以你上面的测试肯定是你现在的结论.

想要看到你要的结果, 可能的方法: 写文件后直接 电脑断电/拔掉硬盘/把windows搞蓝屏. 然后重启机器后去看 文件内容是否改变了...


有一个很简单的方法! 上优盘, debug停住之后, 立刻拔掉优盘! 然后连上优盘, 可以看到没有写入!


正好结合这个问题记一下我对文件缓存的理解. 有误请帮我指出.

我们一般说文件缓存, 其实是有两个缓存;

一个是 application层面的, 使用fflush(c), Writer.flush(java) 来 清空缓存到 OS层面;

一个是 OS 层面的, 使用fsync/msync(c), FileChannel.force/FileDescriptor.sync(java) 来清空缓存到 文件系统.


查看完整回答
反对 回复 2019-04-15
  • 1 回答
  • 0 关注
  • 326 浏览

添加回答

举报

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