java 中的MappedByteBuffer的put方法是直接写入磁盘么?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

2016-03-04 17:37:24 2968 1

调用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才能刷到磁盘.是什么原因?

取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:52:38

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

    0 0
相关问答

1

回答

Java中的StringBuffer类是个什么呢?

2022-04-03 10:28:12 243浏览量 回答数 1

1

回答

Java:StringBuffer和StringBuilder的共同点都是啥呢?

2022-04-02 23:08:57 146浏览量 回答数 1

1

回答

如何在Java的doc中查找String方法啊?

2022-04-03 10:29:59 247浏览量 回答数 1

1

回答

Java 中StringBuffer 怎么进行拼接?

2021-11-12 19:30:06 223浏览量 回答数 1

1

回答

Java 中StringBuffer拼接的优点是什么?

2021-11-12 19:30:06 237浏览量 回答数 1

1

回答

我要对我的Java程序代码进行优化,我想 StringBuffer,StringBuilder的区别

2021-10-29 14:49:50 251浏览量 回答数 1

1

回答

Java Buffer 有哪些子类?

2020-04-12 11:32:07 514浏览量 回答数 1

1

回答

Java ByteBuffer转为字符串

2020-02-08 10:25:07 295浏览量 回答数 1

1

回答

java 中 String 类连接问题

2016-03-18 11:07:43 1510浏览量 回答数 1

1

回答

java中多个StringBuffer错误的相加问题

2016-03-03 16:04:42 1749浏览量 回答数 1
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载