从 Java 7 开始,有一个递归目录扫描。Java 8 可以在语法上对其进行一些改进。
Path start = FileSystems.getDefault().getPath(",,,");
walk(start, "**.java");
需要一个全局匹配类,最好在目录级别,以便跳过目录。
class Glob {
public boolean matchesFile(Path path) {
return ...;
}
public boolean matchesParentDir(Path path) {
return ...;
}
}
那么步行将是:
public static void walk(Path start, String searchGlob) throws IOException {
final Glob glob = new Glob(searchGlob);
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
if (glob.matchesFile(file)) {
...; // Process file
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
return glob.matchesParentDir(dir)
? FileVisitResult.CONTINUE : FileVisitResult.SKIP_SUBTREE;
}
});
}
}