什么时候算是AsynchronousFileChannel写入“完成”?

6
在Java中,当使用AsynchronousFileChannel.write(...)方法时,会返回一个Future对象,通过调用Future.get()方法可以等待操作完成。 当get()方法返回后,数据已经写入磁盘还是只是写入了页面缓存呢? 需要说明的是,我关心的是Linux和ext4平台。
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
请查看这份文档:

https://docs.oracle.com/javase/7/docs/api/java/nio/channels/AsynchronousFileChannel.html#force(boolean)

看起来即使在 Future 上的 get 方法返回后,仍然有一些操作系统级别的缓存可能会阻止内容被写入磁盘。如果你想确保,我认为你必须在 Future 返回后执行一个 force。 相关摘录: 强制将此通道文件的任何更新写入包含它的存储设备。如果此通道文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建此通道以来或自上次调用此方法以来对文件所做的所有更改都已写入该设备。这对于确保关键信息在系统崩溃时不会丢失非常有用。如果文件不驻留在本地设备上,则不提供这样的保证。
metaData参数可用于限制此方法需要执行的I/O操作数量。将此参数传递为false表示只需将文件内容的更新写入存储器;将其传递为true表示必须写入文件内容和元数据的更新,这通常需要至少一个I/O操作。此参数是否实际具有任何效果取决于底层操作系统,因此未指定。
即使通道仅用于读取,调用此方法也可能导致发生I/O操作。例如,某些操作系统作为文件元数据的一部分维护一个最后访问时间,并且每当读取文件时都会更新此时间。是否实际执行此操作取决于系统,因此未指定。
此方法仅保证强制执行通过在此类中定义的方法对此通道文件进行的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,