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

问题描述 投票:4回答:1

fsync(2)manpage告诉同步目录是显式需要的,如果要同步文件。

io包中Java的sync方法怎么样?是否有照顾到这个问题?它是否取决于操作系统或文件系统?

我在 http:/docs.oracle.comjavase7docsapijavaioFileDescriptor.html#sync。...

java linux sync fsync
1个回答
1
投票

fsync 手册页面上写着,调用 fsync 并不意味着相关目录也会被同步。如果需要: fsync 必须为该目录调用。

我可以看到几个很好的理由来解释这个定义行为。

  1. 用于打开文件的目录可能已经不为操作系统所知了。
  2. 文件与目录的关系不是1:1,相关文件可能通过硬链接被多个目录引用。如果一个文件-fsync能保证同步所有引用目录,那么文件系统就必须知道所有这些引用的位置。通常情况下,文件系统只知道目录到文件的方向。
  3. 如果与文件相关联的目录条目已经写入磁盘,那么每当请求文件-fsync时,就没有必要对目录进行fsync了--那会对性能造成不必要的影响。

说完了这些,我们再来看看Java的定义行为。

JavaDoc并没有提到任何关于目录等相关文件系统对象的内容。此外,我没有看到有什么方法可以获得一个 FileDescriptor 实例为一个目录。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.