我有一个简单的问题Efficently查找文件:我重复使用Files.walkFileTree
大和深度嵌套目录结构是这样的:在特定的目录
final int CUTOFF = 5;
final List<Path> foundList = new ArrayList<>();
Files.walkFileTree(codeRoot, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
String rPath = codeRoot.relativize(dir).toString();
int level = rPath.length() - rPath.replace("/", "").length();
if (dir.getFileName().toString().equals("target") || level < CUTOFF) {
return FileVisitResult.CONTINUE;
}
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
if (file.getFileName().toString().endsWith(".txt")) {
foundList.add(file);
}
return FileVisitResult.CONTINUE;
}
});
我的目标是增加特定目录target
下的所有文件,我在codeRoot
下最多知道CUTOFF
等级。
我正在寻找一种更有效的方式在必要stat()
来电或有人说“不能做”的术语来做到这一点。
语言水平Java8。
你为什么认为这可以做到? walkFileTree使用NIO,这意味着它在性能方面很少像本地散步一样好。如果你经常调用它,你可以使用一些缓存。缓存示例:目录(在某些文件系统中)的最后修改时间,用于缓存自上次调用以来未更改过的目录。 –
@MaddenAdamovic我主要想着我可能会错过一些算法快捷方式,因为我的实现过程很天真。另外,我不知道'relativize()'对我可以避免的fs性能有什么影响。你对重复运行优化的想法很好,谢谢! – mabi
你用什么来衡量速度?你是否已经在C/C++中实现了一个类似的解决方案作为参考点?你为什么认为目前效率低下? – Fallso