我不熟悉整个主题,所以我想问你几个问题。
我在程序中具有一项功能,可以在文件系统中搜索与正则表达式匹配的某些文件夹。这意味着,我要在与特定正则表达式匹配的所有子文件夹的特定文件夹中进行搜索。另外,我不想在具有带有特定文件的某个子文件夹的某些子文件夹中进行搜索,因此我想在这些子文件夹中排除搜索。更确切地说,当我在文件夹X中搜索时,我想从搜索中排除X的所有具有特定子文件夹(Person
)并包含特定文件(personality.xml
)的子文件夹。
因此,我已使用java.nio的“尽可能高效”的功能:Files.walkFileTree
。
这是我的实现:
List<Path> paths = new ArrayList<>();
String regex = "myRegex";
Files.walkFileTree(Paths.get("myPathWhereIWantSearchAllSubfoldesr")), new SimpleFileVisitor<>(){
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
if(Files.isHidden(dir)){
return FileVisitResult.SKIP_SUBTREE;
}
if(dir.toFile().getName().contains(regex)){
paths.add(dir);
}
if(Files.exists(Paths.get(String.valueOf(dir), "Config", "ComponentConfig.xml"))){
return FileVisitResult.SKIP_SUBTREE;
}
return FileVisitResult.CONTINUE;
}
});
现在我的问题:
如果我一直为每个文件夹创建一个路径,然后查看是否存在,是否没有创建某种永久性对象以某种方式耗尽内存?如果是这样,它们消耗哪种内存?有什么方法可以清理这些对象,以便它们在搜索过程中不会填满内存或任何垃圾?因为无论如何在搜索过程中,我认为CPU将被大量使用,如果我将搜索应用于一个巨大的文件夹,则我希望避免在内存消耗或CPU使用率方面的任何开销。
我非常感谢您的任何建议,提示或评论。
Java是开放源代码,因此您可以查找Files.walkFileTree
的源代码。究竟如何取决于您的IDE,在Eclipse中只需按F3。查看源代码,可以看到包含Path的Event对象在致电您的访问者后立即被丢弃。确切地说,我正在查看Java 11。