java.io.FileDescriptor#sync()是否特定于单个FileDescriptor

时间:2012-12-04 10:45:41

标签: java filesystems vfs

我希望在我的应用程序中的某些点写入文件后强制同步到磁盘。由于它在Linux上运行,我只能运行

Runtime.getRuntime().exec("sync");

但是,我宁愿不介绍Linux特定的系统调用,而宁愿使用

java.io.FileDescriptor#sync();

但是,我使用Apache VFS在本地文件系统上执行操作,据我所知,它不提供对底层文件描述符的访问。但是,我是否需要访问刚刚写入的实际文件描述符以强制同步?我是否可以不使用任何FileDescriptor来调用同步效果,例如

FileDescriptor.in.sync();

这是一种有效的方法,结果是否与Linux中调用同步的结果相匹配?

万一有人知道是否可以如何访问VFS中的底层FileDescriptor,知道它也是有用的。

编辑:似乎

FileDescriptor.in.sync();

不想在Linux上运行(虽然它在从Eclipse运行时可以在我的Windows机器上运行),但是

new FileOutputStream(new File("anyfile")).getFD().sync();

肯定有效,调用它的结果与直接调用Linux sync命令的结果相匹配。但是,它涉及打开和关闭冗余文件输出流,因此它并不完全理想。任何其他原因这可能是一个坏主意,因为它似乎有效吗?是否有其他方法可以获得可用于同步的FileDescriptor?

1 个答案:

答案 0 :(得分:3)

我前段时间调查了这些问题:Question 1Question 2

在Linux中,java.io.FileDescriptor#sync调用可确保将与描述符关联的文件的已修改数据发送到磁盘。 (那个便宜的磁盘倾向于跳过写入,只将数据放在不可靠(也就是没有NVRAM)的写缓存中是一个不同/另外的问题。) 它不保证也会写回其他文件的修改数据。这不是同步合同或基础fsync POSIX function

但是,在某些情况下(例如数据中的ext3 =有序模式),an fsync on a file writes back up modified data of the file system。这真的很有趣,因为这可能会造成很大的延迟,因为其他一些应用程序已经创建了大量的脏块。