从 FileChannel 获取 MappedByteBuffer 后,我在该缓冲区上使用 put 方法,例如: buffer.put((byte)'a') 然后我发现文件内容是一个字符“a”。与MappedByteBuffer中的“force”方法相同。 “放置”和“强制”有什么不同吗?
最佳答案
put()
将数据存储在缓冲区中,force()
告诉操作系统将缓冲区刷新到磁盘。
在现代操作系统中,您将无法通过查看文件来检测 force()
的结果,因为对同一文件的单独引用共享底层操作系统缓冲区。您可以通过在 put()
之后立即断电来检测差异,因为操作系统不会立即将更改写入磁盘。
不建议频繁调用 force()
,因为它 (1) 会导致上下文切换到内核,并且 (2) 会占用您的 IO channel 。
另请注意,force()
并不能保证数据将位于磁盘上,因为磁盘驱动器有自己的缓冲区缓存。在操作系统认为数据已写入之后、驱动器将数据从缓存移动到盘片之前,完全有可能断电。
关于java - MappedByteBuffer中的 "put"和 "force"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284724/