开发者社区> 问答> 正文

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

调用java 中的MappedByteBuffer的put方法,是直接写入磁盘么?想测试下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才能刷到磁盘.是什么原因?

展开
收起
蛮大人123 2016-03-04 17:37:24 3653 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    说穿了其实非常简单了. 你"同时看磁盘上的数据"的时候, 没有绕过操作系统 去查看文件吧? 所以看到的还是 操作系统的文件缓存里的内容. 所以你上面的测试肯定是你现在的结论.
    想要看到你要的结果, 可能的方法: 写文件后直接 电脑断电/拔掉硬盘/把windows搞蓝屏. 然后重启机器后去看 文件内容是否改变了...
    有一个很简单的方法! 上优盘, debug停住之后, 立刻拔掉优盘! 然后连上优盘, 可以看到没有写入!
    正好结合这个问题记一下我对文件缓存的理解. 有误请帮我指出.
    我们一般说文件缓存, 其实是有两个缓存;
    一个是 application层面的, 使用fflush(c), Writer.flush(java) 来 清空缓存到 OS层面;
    一个是 OS 层面的, 使用fsync/msync(c), FileChannel.force/FileDescriptor.sync(java) 来清空缓存到 文件系统.

    2019-07-17 18:52:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载