从FileChannel获取MappedByteBuffer后,我在这个缓冲区上使用put方法,如: buffer.put((字节) 'A') 然后我发现文件内容写成了一个字符'a'。它与MappedByteBuffer中的“force”方法相同。 'put'和'force'之间有什么不同吗?
答案 0 :(得分:1)
put()
将数据存储在缓冲区中,force()
告诉操作系统将缓冲区刷新到磁盘。
在现代操作系统中,您将无法通过查看文件来检测force()
的结果,因为对同一文件的单独引用共享底层OS缓冲区。您可以通过在put()
之后立即拉动电源来检测差异,因为操作系统不会立即将更改写入磁盘。
不建议经常调用force()
,因为它(1)导致上下文切换到内核,(2)绑定IO通道。
另请注意,force()
并不保证数据将在磁盘上,因为磁盘驱动器有自己的缓冲区缓存。操作系统认为写入数据后,但在驱动器将其从缓存移动到盘片之前,完全有可能断电。
答案 1 :(得分:0)
引自javadoc
强制将对此缓冲区内容所做的任何更改写入包含映射文件的存储设备。 如果映射到此缓冲区的文件驻留在本地存储设备上,那么当此方法返回时,保证自创建缓冲区以来对缓冲区所做的所有更改,或者自上次调用此方法以来,都将写入该设备。 / p>
如果文件不驻留在本地设备上,则不会提供此类保证。
如果此缓冲区未在读/写模式下映射(FileChannel.MapMode.READ_WRITE),则调用此方法无效。
将内存映射文件刷新到磁盘需要系统调用,在linux上这通常通过调用fsync
来完成,强制导致此调用发生,put则不会。