在Java语言中,当调用AsynchronousFileChannel.write(...)时,会收到一个Future,然后可以通过Future.get()等待完成。
当该get()调用返回时,写操作是否已写入磁盘,还是仅写入了页缓存?
如果重要的话,我好奇的具体平台是Linux和ext4。
发布于 2015-10-19 10:53:07
请查看此文档:
看起来,即使在Future上返回get方法之后,在操作系统级别也有一些缓存可能会阻止内容写入磁盘。如果您想真正确定,我认为您必须在Future返回后执行force。
相关摘录:
强制将对此通道文件的任何更新写入包含此通道文件的存储设备。如果此通道的文件驻留在本地存储设备上,则当此方法返回时,可以保证自创建此通道或上次调用此方法以来对文件所做的所有更改都将写入该设备。这对于确保关键信息不会在系统崩溃的情况下丢失非常有用。
如果文件不驻留在本地设备上,则不会做出这样的保证。
metaData参数可用于限制此方法需要执行的I/O操作的数量。如果此参数为false,则表示只需要将对文件内容的更新写入存储;如果为true,则表示必须同时写入对文件内容和元数据的更新,这通常需要至少再执行一次I/O操作。此参数是否实际有效取决于底层操作系统,因此未指定。
调用此方法可能会导致发生I/O操作,即使通道仅为读取而打开。例如,一些操作系统将上次访问时间作为文件元数据的一部分进行维护,并且每当读取文件时,该时间都会更新。此操作是否实际完成取决于系统,因此未指定。
此方法只能强制通过此类中定义的方法对此通道的文件进行更改。
https://stackoverflow.com/questions/33205703
复制相似问题