java - java.io.FileDescriptor.sync() 在 Linux 上 fsync 目录吗?

标签 java linux synchronization fsync

fsync(2) 手册页告诉如果文件被同步,则显式需要同步目录。

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

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

最佳答案

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

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

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

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

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

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

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

    关于java - java.io.FileDescriptor.sync() 在 Linux 上 fsync 目录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547437/

    相关文章:

    linux - 预设字典是否仅对前 32 K 字节的数据有用?

    java - 在 Java EE 中限制对特定方法的多次访问的过程

    java - RestEasy - 无法找到 MessageBodyReader?

    linux - ssh -V 保存到变量

    java - 游戏开发,给Java/Scala程序员的新手建议

    linux - 在 gdb 断点处运行命令,c 或 cont 都不起作用

    javascript - javascript推荐的数据库缓存库

    optimization - CUDA:同步线程

    java - 有效地查找和替换包含 html 的大型 kml 文件?

    java - 使用 AspectJ 根据类型隔离具有相同名称的方法?