我需要获取一个目录中所有文件的列表,包括所有子目录中的文件。用Java完成目录迭代的标准方法是什么?
发布于 2010-07-01 09:13:25
您可以使用File#isDirectory()
来测试给定的文件(路径)是否为目录。如果这是true
,那么您只需使用其File#listFiles()
结果再次调用相同的方法。这称为recursion。
这是一个基本的启动示例:
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很敏感。如果您已经在使用Java8或更新版本,那么最好使用利用tail recursion的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());
}
}
}
发布于 2010-07-01 09:55:32
如果你使用的是Java1.7,你可以使用java.nio.file.Files.walkFileTree(...)
。
例如:
public class WalkFileTreeExample {
public static void main(String[] args) {
Path p = Paths.get("/usr");
FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
};
try {
Files.walkFileTree(p, fv);
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果您使用的是Java8,则可以将流接口与java.nio.file.Files.walk(...)
一起使用
public class WalkFileTreeExample {
public static void main(String[] args) {
try (Stream<Path> paths = Files.walk(Paths.get("/usr"))) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
发布于 2014-11-08 01:59:45
使用org.apache.commons.io.FileUtils
File file = new File("F:/Lines");
Collection<File> files = FileUtils.listFiles(file, null, true);
for(File file2 : files){
System.out.println(file2.getName());
}
如果不需要子目录中的文件,请使用false。
https://stackoverflow.com/questions/3154488
复制相似问题