我需要在目录中找到所有Java文件
private void search(File directory) {
if (directory.isDirectory()) {
File[] javaFilesLs = directory.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".java");
// return name.toLowerCase().endsWith(".java") || dir.isDirectory();
}
});
if (directory.canRead()) {
assert javaFilesLs != null;
for (File temp : javaFilesLs) {
if (temp.isDirectory()) {
search(temp);
} else {
fileList.add(temp.getAbsolutePath());
}
}
}
}
}
使用注释行时,它会找到子目录和所有文件,而不仅仅是".java"
个文件。
答案 0 :(得分:2)
使用注释行获取所有路径的原因是dir.isDirectory()
将为所有文件返回true
。
看一下FilenameFilter的文档。它指定dir
是“在其中找到文件的目录。”
因此,您不必检查dir
,而必须检查name
是否代表目录。也许有更聪明的方法,但是可以这样:
new File(dir.toPath().toString(), name).isDirectory() // returns true for directories
整个代码段如下所示:
private void search(File directory) {
if (directory.isDirectory()) {
File[] javaFilesLs = directory.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".java") || new File(dir.toPath().toString(), name).isDirectory();
}
});
if (directory.canRead()) {
assert javaFilesLs != null;
for (File temp : javaFilesLs) {
if (temp.isDirectory()) {
search(temp);
} else {
fileList.add(temp.getAbsolutePath());
}
}
}
}
}
或者,Java 8添加了Files.walk,它为您实现了作为流的递归。
private void search(File directory) throws IOException {
Files.walk(directory.toPath())
.filter(f -> {
return f.getFileName().toString().endsWith(".java");
})
.forEach(f -> fileList.add(f.toFile().getAbsolutePath()));
}