我希望在我的应用程序中的某些点写入文件后,强制同步到磁盘。因为它是在Linux上运行的,所以我可以只运行
Runtime.getRuntime().exec("sync");但是,我不想引入特定于Linux的系统调用,而是使用
java.io.FileDescriptor#sync();但是,我使用Apache VFS在本地文件系统上执行操作,据我所知,它不提供对底层文件描述符的访问。但是,为了强制同步,我是否需要访问刚刚写入的实际文件描述符?例如,我不能只使用任何FileDescriptor来调用同步以达到相同的效果吗
FileDescriptor.in.sync();这是一种有效的方法吗?结果是否与在Linux中调用sync的结果相匹配?
如果有人知道是否/如何可以访问VFS中的底层FileDescriptor,那么知道也是很有用的。
编辑:看起来
FileDescriptor.in.sync();我不想在Linux上工作(虽然它在我的Windows机器上从Eclipse运行时可以工作),但是
new FileOutputStream(new File("anyfile")).getFD().sync();绝对有效,并且调用此命令的结果与直接调用Linux sync命令的结果相匹配。然而,它涉及到打开和关闭冗余的文件输出流,所以它并不是很理想。有没有其他原因这可能是一个坏主意,因为它看起来确实有效?有没有其他方法可以获得一个可以用来同步的FileDescriptor?
发布于 2013-03-08 00:37:10
前段时间我研究过这样的问题:Question 1、Question 2。
在Linux中,java.io.FileDescriptor#sync调用确保将与描述符关联的文件的修改数据发送到磁盘。(便宜的磁盘倾向于跳过写入,只将数据放在不可靠(也称为无NVRAM)的写缓存中,这是一个不同的/额外的问题。)它不能保证其他文件的修改数据也会被写回。这不在同步或底层fsync POSIX function的合同中。
但是,在某些情况下(例如data=ordered模式下的ext3 ),an fsync on a file writes back up modified data of the file system。这真的很有趣,因为这可能会因为其他应用程序创建了大量脏块而造成显着的延迟。
https://stackoverflow.com/questions/13701137
复制相似问题