在 Java 中获取目录及其子目录中所有文件的非递归方法

2022-09-03 17:12:25

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

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调用)来做到这一点。如果没有,这是最干净的方式吗?


答案 1

您始终可以使用堆栈(对于 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"));

答案 2

Java 8 以后,您可以使用 Files#walk 以递归方式列出给定目录中的所有文件和目录。此外,如果您只需要常规文件,则可以应用过滤器来过滤掉目录。Files::isRegularFile

另一方面,如果您只需要列出给定目录而不需要列出其子目录,则可以使用惰性方法Files#list,它只会为您提供给定目录中的文件和目录。您可以再次应用上述过滤器。