java.io.FileDescriptor.sync() 是否在 Linux 上同步目录?

ebe*_*rom 5 java linux synchronization fsync

fsync(2) 联机帮助页告诉如果同步文件,则明确需要同步目录。

io包中Java的sync方法怎么样?是在意那个吗?它是否取决于操作系统和/或文件系统?

我在http://docs.oracle.com/javase/7/docs/api/java/io/FileDescriptor.html#sync 中发现没有任何帮助...

hor*_*str 2

手册fsync页指出,调用fsync文件并不意味着关联的目录也将被同步。如果需要,fsync必须调用目录。

我可以看到这个定义/行为的几个很好的理由:

  1. 操作系统可能不再知道用于打开文件的目录。
  2. 文件与目录的关系不是 1:1,有问题的文件可以通过硬链接被多个目录引用。如果保证 file-fsync 同步所有引用目录,则文件系统必须知道所有这些引用的位置。通常,文件系统只知道文件的方向目录。
  3. 如果与文件关联的目录条目已写入磁盘,则每当请求文件 fsync 时 fsync 目录就没有意义 - 这将是不必要的性能损失。

抛开这些,让我们看看 Java 的定义/行为。

JavaDoc 没有提及任何与目录等相关文件系统对象有关的内容。FileDescriptor此外,我没有找到获取目录实例的方法。

根据其源代码查看 OpenJDK 实现的行为,只需在 UNIX 和Windows 上java.io.FileDescriptor.sync()触发一个。fsyncFlushFileBuffers

所以,不,java.io.FileDescriptor.sync()不会以任何方式影响关联的目录。