本文目录导读:

- 使用
File.listFiles()方法(基础版) - 使用 Java 8 的 Files.walk() 方法(推荐)
- 使用 Files.walkFileTree() 方法(高级版)
- 过滤特定类型的文件
- 只遍历当前目录(不递归)
- 使用 Apache Commons IO
- 使用建议
在Java中遍历文件夹文件有多种方式,下面介绍几种最常用的方法:
使用 File.listFiles() 方法(基础版)
import java.io.File;
public class FileTraversal {
public static void main(String[] args) {
String folderPath = "D:/your-folder";
listFiles(new File(folderPath));
}
public static void listFiles(File folder) {
if (folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("目录: " + file.getAbsolutePath());
listFiles(file); // 递归遍历子目录
} else {
System.out.println("文件: " + file.getAbsolutePath());
}
}
}
}
}
}
使用 Java 8 的 Files.walk() 方法(推荐)
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.stream.Stream;
public class FilesWalkExample {
public static void main(String[] args) throws IOException {
try (Stream<Path> walk = Files.walk(Paths.get("D:/your-folder"))) {
walk.forEach(path -> {
if (Files.isDirectory(path)) {
System.out.println("目录: " + path);
} else {
System.out.println("文件: " + path);
}
});
}
}
}
使用 Files.walkFileTree() 方法(高级版)
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class FileTreeExample {
public static void main(String[] args) throws IOException {
Path startPath = Paths.get("D:/your-folder");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("文件: " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println("目录: " + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println("访问文件失败: " + file);
return FileVisitResult.CONTINUE;
}
});
}
}
过滤特定类型的文件
import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;
public class FilterFilesExample {
public static void main(String[] args) throws IOException {
try (Stream<Path> walk = Files.walk(Paths.get("D:/your-folder"))) {
walk.filter(Files::isRegularFile)
.filter(path -> path.toString().endsWith(".txt"))
.forEach(System.out::println);
}
}
}
只遍历当前目录(不递归)
import java.io.File;
import java.nio.file.*;
public class ShallowTraversal {
public static void main(String[] args) {
// 方法1: 使用 File
File folder = new File("D:/your-folder");
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
System.out.println(file.getName());
}
}
// 方法2: 使用 Files.list() (Java 8+)
try (Stream<Path> paths = Files.list(Paths.get("D:/your-folder"))) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 Apache Commons IO
如果你使用 Maven,先添加依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Collection;
public class CommonsIOExample {
public static void main(String[] args) {
File folder = new File("D:/your-folder");
// 获取所有文件(包括子目录中的)
Collection<File> files = FileUtils.listFiles(folder,
new String[]{"txt", "java"}, // 文件扩展名
true); // 是否递归子目录
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
}
使用建议
- 简单遍历:使用
Files.walk()方法 - 需要控制遍历过程:使用
Files.walkFileTree()方法 - 只需要当前目录:使用
File.listFiles()或Files.list() - 需要文件过滤:结合 Stream API 的 filter
- 项目中已有 Commons IO:使用 FileUtils 工具类
选择哪种方法取决于你的具体需求,如是否需要递归、是否需要过滤、是否需要处理异常等。