什么时候AsynchronousFileChannel写“完成”?

时间:2015-10-19 02:29:26

标签: java asynchronous nio

在Java中,当有人呼叫AsynchronousFileChannel.write(...)时,会收到Future,然后可以通过Future.get()等待其完成。

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

如果重要的话,我很好奇的特定平台是Linux& EXT4。

1 个答案:

答案 0 :(得分:2)

查看此文档:

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

即使在get上返回Future方法之后,操作系统级别仍有一些缓存可能会阻止将内容写入磁盘。如果您想确定,我认为您必须在force返回后执行Future

相关摘录:

  

强制将此频道文件的任何更新写入存储   包含它的设备。如果此频道的文件位于本地   存储设备然后当这个方法返回时它保证全部   自创建此通道以来,对此文件所做的更改   方法最后被调用,将被写入该设备。这个   有助于确保关键信息不会丢失   系统崩溃事件。

     

如果文件不驻留在本地设备上,则没有这样的保证   是的。

     

metaData参数可用于限制I / O的数量   此方法需要执行的操作。传递虚假   此参数表示只需要更新文件的内容   写入存储;传递true表示对两者的更新   必须编写文件的内容和元数据,这通常是必需的   至少再进行一次I / O操作。这个参数实际上是否有   任何影响都取决于底层的操作系统   因此没有具体说明。

     

调用此方法可能会导致发生I / O操作   频道只开放阅读。一些操作系统,用于   例如,将最后访问时间维护为文件元数据的一部分,并且   每次读取文件时都会更新此时间。是否这样   实际完成的是与系统相关的,因此未指定。

     

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