当我想确保 MappedByteBuffer 的更改应该同步回磁盘时,我需要randomAcccessFile.getFD().sync()
还是mappedByteBuffer.force()
两者都需要?(在我的简单测试中,它们似乎都不是必需的 - 令人困惑......)
有人对实际的基础操作有一个想法,或者至少可以解释差异(如果有的话)?
当我想确保 MappedByteBuffer 的更改应该同步回磁盘时,我需要randomAcccessFile.getFD().sync()
还是mappedByteBuffer.force()
两者都需要?(在我的简单测试中,它们似乎都不是必需的 - 令人困惑......)
有人对实际的基础操作有一个想法,或者至少可以解释差异(如果有的话)?
首先,FileDescriptor.sync 等价于 FileChannel.force(调用 POSIX fsync 方法)
其次,在 Ron Hitchens 的书“Java NIO”中(通过谷歌书籍)在关于 MappedByteBuffer 的章节中它说
MappedByteBuffer.force() 类似于 FileChannel 类中的同名方法。它强制对映射缓冲区所做的任何更改刷新到永久磁盘存储。通过 MappedByteBuffer 对象更新文件时,应始终使用 MappedByteBuffer.force() 而不是 FileChannel.force()。通道对象可能不知道通过映射缓冲区进行的所有文件更新。MappedByteBuffer 没有给你不刷新文件元数据的选项——它也总是被刷新。请注意,关于非本地文件系统的相同注意事项在这里适用于 FileChannel.force
所以,是的。您需要调用 MappedByteBuffer.force!
但是后来我发现了这个错误,这表明至少在 Windows 上这两个调用仍然是必要的。