调用java 中的MappedByteBuffer的put方法,是直接写入磁盘么?
迷茫
迷茫 2017-04-17 11:21:50
[Java讨论组]

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)
大家讲道理

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

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


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


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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号