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

时间:2013-08-08 17:08:03

标签: java file-io java-7 directory-structure

DirectoryStream的文档明确指出:

  

迭代器非常一致。它是线程安全但不是   迭代时冻结目录,因此它可能(或可能不)反映   对DirectoryStream之后发生的目录的更新   创建。

在我的机器上,我在调试模式下对目录执行了一个简单的迭代。在迭代完成之前,我打破了执行,将文件添加到正在迭代的目录并重新开始。迭代没有看到额外文件。

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

2 个答案:

答案 0 :(得分:4)

文档有意含糊不清。 JVM必须在许多不同类型的机器上运行:Windows和Unix衍生产品。不同的文件系统有不同的行为。如果您希望程序在多台计算机上可靠地工作,您必须(我重复,必须)设计最坏的情况。

最少惊喜的法则建议您应该整个DirectoryStream来获取快照(或非常接近一个),迭代快照,然后重新淹没流。然后,您可以比较快照的不同版本以确定对基础目录的更改。

答案 1 :(得分:2)

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

文档有意模糊,在POSIX下,它委托给readdir also intentionally vague

  

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

但是,如果您正在执行某个实施依赖于该模糊性的具体案例,那么Linux ext3 readdir and concurrent updates会在rsync文件系统中显示ext3的情况,似乎看到文件出现在创建它们的顺序之外的目录中。