当我想要确保MappedByteBuffer的更改应该同步回光盘时,我需要randomAcccessFile.getFD().sync()或mappedByteBuffer.force(),还是两者都需要?(在我的简单测试中,它们似乎都不是必需的-令人困惑...)
有人对实际的底层操作有一个想法,或者至少可以解释差异吗?
发布于 2012-12-23 22:28:42
首先,FileDescriptor.sync等同于FileChannel.force (调用POSIX fsync方法)
第二,在Ron Hitchens (通过google books)关于MappedByteBuffer的章节中的"Java NIO“一书中说
MappedByteBuffer.force()类似于FileChannel类中同名的方法。它强制将对映射缓冲区所做的任何更改刷新到永久磁盘存储中。通过MappedByteBuffer对象更新文件时,应始终使用MappedByteBuffer.force()而不是FileChannel.force()。频道对象可能不知道通过映射缓冲区进行的所有文件更新。MappedByteBuffer不提供不刷新文件元数据的选项--它总是被刷新的。请注意,这里对非本地文件系统的注意事项与对FileChannel.force的注意事项相同
所以,是的。你需要给MappedByteBuffer.force打电话!
但后来我发现了this bug,这表明这两个调用仍然是必要的,至少在Windows上是这样。
https://stackoverflow.com/questions/14011398
复制相似问题