Java的java.nio.file.Files.walkFileTree()执行访问者的visitFile()方法,即使文件不存在(最近删除的文件)。
FileUtils.forceDelete(certainFile);
Files.exists(certainFile.toPath()); // Returns false, as expected
MySimpleFileVisitor visitor = new MySimpleFileVisitor(); // Extends SimpleFileVisitor. All it does is override visitFile() so I can see that it visits the deleted file.
Files.walkFileTree(directory, visitor); // Calls visitor.visitFile on certainFile. Not expected!
这可能吗?我正在使用Windows,该文件位于网络驱动器上。
Files.walkFileTree()调用FileTreeWalker.walk(),它调用Files.newDirectoryStream()。我能想到的唯一解释是Files.newDirectoryStream返回包含已删除文件的DirectoryStream。
答案 0 :(得分:4)
是的,这是可能的。
让我们假设Files.walk…
方法都使用DirectoryStream来遍历文件树(至少从Java 1.8.0_05开始,它们实际上是它们)或内部等价物。 documentation for DirectoryStream说:
迭代器非常一致。它是线程安全的,但在迭代时不会冻结目录,因此它可能(或可能不)反映在创建DirectoryStream之后发生的目录的更新。
答案 1 :(得分:4)
是的,有可能。就我而言,必须满足以下条件才能重现失败:
我刚刚发现了所有这些信息,这就是原始问题中没有提及的原因。