我需要FileDescriptor“sync”和MappedByteBuffer“强制”吗?

时间:2012-12-23 13:37:28

标签: java nio memory-mapped-files

如果我想确保将MappedByteBuffer的更改同步回光盘,我需要randomAcccessFile.getFD().sync()mappedByteBuffer.force()或两者兼而有之吗? (在我的简单测试中,似乎不需要它们 - 令人困惑......)

有人对实际的基础操作有所了解,或者至少可以解释其中的差异吗?

1 个答案:

答案 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上仍然需要这两个调用。