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

java.io.FileDescriptor#sync()是否特定于单个FileDescriptor,java,filesystems,vfs,Java,Filesystems,Vfs,我希望在我的应用程序中的某些点写入文件后,强制同步到磁盘。因为它是在Linux上运行的,所以我可以不运行它 Runtime.getRuntime().exec("sync"); 然而,我宁愿不介绍Linux特定的系统调用,而使用 java.io.FileDescriptor#sync(); 但是,我使用ApacheVFS在本地文件系统上执行操作,据我所知,它不提供对底层文件描述符的访问。但是我需要访问刚刚写入以强制同步的实际文件描述符吗?例如,我可以不使用任何FileDescriptor来调

我希望在我的应用程序中的某些点写入文件后,强制同步到磁盘。因为它是在Linux上运行的,所以我可以不运行它

Runtime.getRuntime().exec("sync");
然而,我宁愿不介绍Linux特定的系统调用,而使用

java.io.FileDescriptor#sync();
但是,我使用ApacheVFS在本地文件系统上执行操作,据我所知,它不提供对底层文件描述符的访问。但是我需要访问刚刚写入以强制同步的实际文件描述符吗?例如,我可以不使用任何FileDescriptor来调用sync以获得相同的效果吗

FileDescriptor.in.sync();
这是一种有效的方法吗?其结果是否与在Linux中调用sync的结果相匹配

如果有人知道是否/如何能够访问VFS中的底层FileDescriptor,那么了解这一点也很有用

编辑:看来

FileDescriptor.in.sync();
不想在Linux上工作(虽然从Eclipse运行时它可以在我的Windows机器上工作),但是


确实有效,调用此命令的结果与直接调用Linux sync命令的结果相匹配。但是,它涉及打开和关闭冗余文件输出流,因此并不理想。这可能是个坏主意,因为它看起来确实有效,还有其他原因吗?是否有其他方法可以获取可用于同步的FileDescriptor?

我不久前研究过这样的问题:

在Linux中,调用可确保将与描述符关联的文件的修改数据发送到磁盘。(便宜的磁盘往往会跳过写操作,而只将数据放在不可靠(即无NVRAM)的写缓存中,这是另一个问题。) 它不保证其他文件的修改数据也被写回。这只是不在同步合同或基础合同中


但是,在某些情况下(例如数据=有序模式下的ext3)。这真的很有趣,因为这可能会产生显著的延迟,因为其他应用程序已经创建了大量脏块。

根据我在Android上的经验,在新的FileDescriptor上调用sync不会导致内核同步在同一路径上打开的其他FileDescriptor。
new FileOutputStream(new File("anyfile")).getFD().sync();