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

标签 java filesystems vfs

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

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

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

java.io.FileDescriptor#sync();

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

FileDescriptor.in.sync();

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

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

编辑:看来

FileDescriptor.in.sync();

不想在 Linux 上工作(尽管从 Eclipse 运行时它在我的 Windows 机器上工作),但是

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

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

最佳答案

我前段时间调查过这样的问题:Question 1 , Question 2 .

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

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

关于java - java.io.FileDescriptor#sync() 是否特定于单个 FileDescriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13701137/

相关文章:

schema - 蒙德里安在 Web 应用程序中使用时无法在 VFS 中找到架构

java - ant jar的主类

java - 使用外部库创建 Jar(Intellij Idea 2017)

java - 值(value)协会的关键

c# - 如何从回收站获取已安装卷/磁盘的文件列表?

c - 在 C 中获取文件系统创建日期

c - C 如何使用 read 系统调用读取字节?

java - 对于 ArrayList,通过引用传递不会在 RMI 中返回

linux - 为什么 Linux 启动时会为根目录 "/"初始化一些 dentry

java - vfs2 DefaultFileMonitor 线程提前终止