如果我想确保将MappedByteBuffer的更改同步回光盘,我需要randomAcccessFile.getFD().sync()
或mappedByteBuffer.force()
或两者兼而有之吗? (在我的简单测试中,似乎不需要它们 - 令人困惑......)
有人对实际的基础操作有所了解,或者至少可以解释其中的差异吗?
答案 0 :(得分:2)
首先,FileDescriptor.sync相当于FileChannel.force(调用POSIX fsync方法)
第二,在关于MappedByteBuffer的章节中,来自Ron Hitchens的书“Java NIO”(通过google books),它说
MappedByteBuffer.force()类似于FileChannel类中的同名方法。它强制将对映射缓冲区所做的任何更改刷新到永久磁盘存储。通过MappedByteBuffer对象更新文件时,应始终使用MappedByteBuffer.force()而不是FileChannel.force()。通道对象可能不知道通过映射缓冲区进行的所有文件更新。 MappedByteBuffer没有为您提供不刷新文件元数据的选项 - 它也总是被刷新。请注意,关于非本地文件系统的相同注意事项适用于此处,与FileChannel.force
相同
所以,是的。你需要调用MappedByteBuffer.force!
然后我发现this bug表示至少在Windows上仍然需要这两个调用。