什么时候AsynchronousFileChannel写"完成"?

Bry*_*yce 6 java asynchronous nio

在Java中,当一个调用AsynchronousFileChannel.write(...)一个接收a时Future,哪个可以等待完成Future.get().

当该get()调用返回时,写入是写入磁盘还是只写入页面缓存?

如果重要的话,我很好奇的特定平台是Linux和ext4.

Ven*_*kat 2

查看此文档:

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

看起来即使在get该方法返回后Future,操作系统级别的一些缓存可能会阻止内容写入磁盘。如果你想真正确定,我认为你必须在退货force后做一次Future

相关摘录:

强制将此通道文件的任何更新写入包含该文件的存储设备。如果此通道的文件驻留在本地存储设备上,那么当此方法返回时,可以保证自此通道创建以来或自上次调用此方法以来对文件所做的所有更改都已写入该设备。这对于确保在系统崩溃时不会丢失关键信息非常有用。

如果该文件不驻留在本地设备上,则不会做出此类保证。

metaData 参数可用于限制该方法需要执行的 I/O 操作的数量。对此参数传递 false 表示仅需要将文件内容的更新写入存储;传递 true 表示必须写入对文件内容和元数据的更新,这通常需要至少再进行一次 I/O 操作。该参数实际上是否有任何影响取决于底层操作系统,因此未指定。

即使通道仅打开用于读取,调用此方法也可能会导致发生 I/O 操作。例如,某些操作系统将上次访问时间作为文件元数据的一部分进行维护,并且每当读取文件时都会更新该时间。这是否实际完成取决于系统,因此未指定。

此方法仅保证强制通过此类中定义的方法对此通道的文件进行更改。