Java 迭代DirectoryStream并同时更改目录内容

Java 迭代DirectoryStream并同时更改目录内容,java,file-io,java-7,directory-structure,Java,File Io,Java 7,Directory Structure,DirectoryStream的文档清楚地说明: 迭代器是弱一致的。它是线程安全的,但不是 在迭代时冻结目录,这样它可能(也可能不)反映 在删除DirectoryStream后发生的目录更新 创造 在我的机器上,我在调试模式下对一个目录执行了一个简单的迭代。在迭代完成之前,我中断了执行,将一个文件添加到正在迭代和恢复的目录中。迭代没有看到额外的文件 我的问题是:在什么情况下迭代会反映目录内容的更新? 不幸的是,正式文件对此非常模糊。至少可以这么说。文档故意含糊不清。JVM必须在多种不同类型的机器

DirectoryStream的文档清楚地说明:

迭代器是弱一致的。它是线程安全的,但不是 在迭代时冻结目录,这样它可能(也可能不)反映 在删除DirectoryStream后发生的目录更新 创造

在我的机器上,我在调试模式下对一个目录执行了一个简单的迭代。在迭代完成之前,我中断了执行,将一个文件添加到正在迭代和恢复的目录中。迭代没有看到额外的文件

我的问题是:在什么情况下迭代会反映目录内容的更新?
不幸的是,正式文件对此非常模糊。至少可以这么说。

文档故意含糊不清。JVM必须在多种不同类型的机器上运行:Windows和Unix衍生工具。不同的文件系统具有不同的行为。如果你想让你的程序在多台计算机上可靠地工作,你必须(我重复一遍,必须)为最坏的情况而设计


最小惊奇法则建议您应该过滤整个DirectoryStream以获得快照(或非常接近快照),迭代快照,然后重新过滤流。然后,您可以比较快照的不同版本,以确定对底层目录的更改。

因为
DirectoryStream
是一个接口,而且由于NIO.2的这一部分是可插入的,所以不要将您的考虑局限于JDK for Linux和Windows附带的实现。完全可以编写具有该行为的自定义实现,或者集群或分布式实现将该行为作为副作用


文档故意含糊不清,在POSIX下,它委托给
readdir
,即:

如果在最近一次调用opendir()或rewinddir()之后从目录中删除或添加了文件,则未指定后续调用readdir\u r()是否返回该文件的条目


但是,如果您正在寻找一个具体的案例,其中一个实现依赖于这种模糊性,那么将显示一个案例,其中
rsync
,在一个大容量的
ext3
文件系统上,似乎看到文件在目录中的显示顺序与创建顺序不同。

我不知道,但我读取它的方式是不确定的,并且可能取决于底层OS/FS和/或特定实现。我的最佳猜测是,如果您的目录位于树中比迭代器指向的当前索引节点更晚的索引节点上,那么它将反映更新。我不知道如何挑起这种行为。我自信地说,使用纯Java是不可能立即实现的(以确定性的方式)。我完全同意这个结论,这个问题是出于学术兴趣。