我需要获取目录中所有文件的列表,包括所有子目录中的文件。使用 Java 完成目录迭代的标准方法是什么?
您可以使用File#isDirectory() https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#isDirectory()测试给定文件(路径)是否是目录。如果这是true
,然后你只需再次调用相同的方法File#listFiles() https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#listFiles()结果。这就是所谓的递归 https://en.wikipedia.org/wiki/Recursion_(computer_science).
这是一个基本的启动示例:
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 https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/StackOverflowError.html当树的深度超过 JVM 堆栈所能容纳的深度时。如果您已经使用 Java 8 或更高版本,那么您最好使用Files#walk() https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#walk(java.nio.file.Path,java.nio.file.FileVisitOption...)相反,它利用尾递归 https://en.wikipedia.org/wiki/Tail_call:
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());
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)