5

fsync(2) 手册页告诉同步目录是否明确需要同步文件。

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

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

4

1 回答 1

1

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

我可以看到该定义/行为的几个充分理由:

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

顺便说一句,让我们看看 Java 的定义/行为。

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

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

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

于 2020-05-09T16:18:44.813 回答