我需要获取目录中所有文件的列表,包括所有子目录中的文件。用Java完成目录迭代的标准方法是什么?
您可以File#isDirectory()用来测试给定的文件(路径)是否是一个目录。如果这是true,那么您只需再次调用相同的方法及其File#listFiles()结果。这称为递归。
File#isDirectory()
true
File#listFiles()
这是一个基本的启动示例:
package com.stackoverflow.q3154488; import java.io.File; public class Demo { public static void main(String... args) { File dir = new File("/path/to/dir"); showFiles(dir.listFiles()); } public static void showFiles(File[] files) { for (File file : files) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); showFiles(file.listFiles()); // Calls same method again. } else { System.out.println("File: " + file.getAbsolutePath()); } } } }
请注意,StackOverflowError当树比 JVM 的堆栈可以容纳的更深时,这很敏感。如果您已经在使用 Java 8 或更新版本,那么您最好使用Files#walk()使用尾递归的方法:
StackOverflowError
Files#walk()
package com.stackoverflow.q3154488; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class DemoWithJava8 { public static void main(String... args) throws Exception { Path dir = Paths.get("/path/to/dir"); Files.walk(dir).forEach(path -> showFile(path.toFile())); } public static void showFile(File file) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); } else { System.out.println("File: " + file.getAbsolutePath()); } } }