Java 如何 真正 将写入文件的数据与块设备进行刷新/同步。
我用NIO尝试了这段代码:
FileOutputStream s = new FileOutputStream(filename)
Channel c = s.getChannel()
while(xyz)
c.write(buffer)
c.force(true)
s.getFD().sync()
c.close()
我认为c.force(true)与s.getFD()。sync()一起应该足够了,因为强制状态的文档
强制对此通道文件的任何更新都写入包含它的存储设备。如果此通道的文件位于本地存储设备上,则当此方法返回时,可以保证自创建此通道以来,或自上次调用此方法以来,对该文件所做的所有更改都将被写入该设备。这对于确保在系统崩溃时不会丢失关键信息很有用。
同步状态说明文件:
强制所有系统缓冲区与基础设备同步。在此FileDescriptor的所有修改后的数据和属性都已写入相关设备之后,此方法返回。特别是,如果此FileDescriptor引用物理存储介质,例如文件系统中的文件,则在与该FileDesecriptor关联的缓冲区的所有内存中已修改副本已写入物理介质之前,同步不会返回。sync是由需要物理存储(例如文件)处于已知状态的代码使用的。
这两个调用应该足够了。是吗?我想不是。
背景:我使用C / Java进行了较小的性能比较(2 GB,顺序写入),Java版的速度是C版的两倍,并且可能比硬件(单个HD上的120 MB /
s)快。我还尝试与Runtime.getRuntime()。exec(“ sync”)执行命