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。

最佳答案

是的,有可能。

让我们假设Files.walk…方法都使用DirectoryStreams遍历文件树(实际上至少在Java 1.8.0_05版本中如此)或内部等效树。 documentation for DirectoryStream说:


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

10-04 15:58
查看更多