以递归方式获取Java中的目录及其子目录中的所有文件

时间:2011-07-21 12:45:56

标签: java file directory subdirectory

我试图获取目录及其子目录中所有文件的列表。我目前的递归方法如下:

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调用)。如果没有,这是最干净的方法吗?

3 个答案:

答案 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,它只会为您提供给定目录中的文件和目录。您可以再次应用上述过滤器。