我试图获取目录及其子目录中所有文件的列表。我目前的递归方法如下:
private void printFiles(File dir) {
for (File child : dir.listFiles()) {
if (child.isDirectory()) {
printFiles(child);
} else if (child.isFile()) {
System.out.println(child.getPath());
}
}
}
printFiles(new File("somedir/somedir2"));
但是,我希望有一种非递归方式(可能是现有的API调用)。如果没有,这是最干净的方法吗?
答案 0 :(得分:25)
您可以使用堆栈(对于DFS)或队列(对于BFS)始终使用迭代解决方案替换递归解决方案:
private void printFiles(File dir) {
Stack<File> stack = new Stack<File>();
stack.push(dir);
while(!stack.isEmpty()) {
File child = stack.pop();
if (child.isDirectory()) {
for(File f : child.listFiles()) stack.push(f);
} else if (child.isFile()) {
System.out.println(child.getPath());
}
}
}
printFiles(new File("abc/def.ghi"));
答案 1 :(得分:3)
FileUtils可能是最好的方式。 (链接问题的复制) 仅发布,所以搜索此内容的人会看到它并且可能不会阅读评论
编辑:要使用的方法Listfiles
答案 2 :(得分:3)
Java 8以后,您可以使用Files#walk以递归方式列出给定目录中的所有文件和目录。此外,如果只需要常规文件,则可以应用像Files::isRegularFile
这样的过滤器来过滤掉目录。
另一方面,如果您只需要列出给定目录而不是其子目录,则可以使用惰性方法Files#list,它只会为您提供给定目录中的文件和目录。您可以再次应用上述过滤器。