在Java中,当有人呼叫AsynchronousFileChannel.write(...)
时,会收到Future
,然后可以通过Future.get()
等待其完成。
当get()
调用返回时,写入是写入磁盘还是仅写入页面缓存?
如果重要的话,我很好奇的特定平台是Linux& EXT4。
答案 0 :(得分:2)
查看此文档:
即使在get
上返回Future
方法之后,操作系统级别仍有一些缓存可能会阻止将内容写入磁盘。如果您想确定,我认为您必须在force
返回后执行Future
。
相关摘录:
强制将此频道文件的任何更新写入存储 包含它的设备。如果此频道的文件位于本地 存储设备然后当这个方法返回时它保证全部 自创建此通道以来,对此文件所做的更改 方法最后被调用,将被写入该设备。这个 有助于确保关键信息不会丢失 系统崩溃事件。
如果文件不驻留在本地设备上,则没有这样的保证 是的。
metaData参数可用于限制I / O的数量 此方法需要执行的操作。传递虚假 此参数表示只需要更新文件的内容 写入存储;传递true表示对两者的更新 必须编写文件的内容和元数据,这通常是必需的 至少再进行一次I / O操作。这个参数实际上是否有 任何影响都取决于底层的操作系统 因此没有具体说明。
调用此方法可能会导致发生I / O操作 频道只开放阅读。一些操作系统,用于 例如,将最后访问时间维护为文件元数据的一部分,并且 每次读取文件时都会更新此时间。是否这样 实际完成的是与系统相关的,因此未指定。
此方法仅保证强制对此进行更改 通过此类中定义的方法获得通道的文件。