375. Java IO API - 列出目录内容
在 Java NIO 中,如果你想查看一个目录中的所有文件、子目录、符号链接等条目,推荐使用 Files.newDirectoryStream() 方法。这是一种高效、可扩展的方式,适用于大规模目录遍历。
🚀 核心方法简介
DirectoryStream<Path> stream = Files.newDirectoryStream(Path dir);
- 返回一个
DirectoryStream<Path>,该接口本身实现了Iterable<Path>。 - 支持高效迭代目录内容,适合目录下条目较多的情况。
- 推荐使用
try-with-resources自动关闭资源。
✅ 基本示例:打印目录内容
import java.nio.file.*;
import java.io.IOException;
public class ListDirContents {
public static void main(String[] args) {
Path dir = Paths.get("your-directory-path-here");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path entry : stream) {
System.out.println("Entry: " + entry.getFileName());
}
} catch (IOException | DirectoryIteratorException e) {
System.err.println("Error reading directory: " + e.getMessage());
}
}
}
🧠 提示:
- 使用
entry.getFileName()获取文件名(而不是完整路径)。 - 这是按目录中的顺序返回所有内容(包括隐藏文件、子目录、符号链接等)。
🧹 try-with-resources 的重要性
DirectoryStream 是一个可关闭资源,如果你不使用 try-with-resources,需要手动调用 stream.close(),否则可能导致资源泄露。
☕ 使用
Java 7+的try-with-resources可以确保在使用完毕后自动关闭流资源。
🎯 输出路径的完整形式(绝对路径)
你也可以输出完整路径,例如:
System.out.println("Full path: " + entry.toAbsolutePath());
🔍 过滤目录内容(按扩展名或模式筛选)
你可以使用重载的 newDirectoryStream(Path dir, String glob) 方法对结果进行过滤。
示例:只列出 .txt 文件
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.txt")) {
for (Path entry : stream) {
System.out.println("Text file: " + entry.getFileName());
}
}
🧠 Glob 模式支持:
"*.java"匹配所有 Java 文件"*.*"匹配包含扩展名的所有文件"data-??.log"匹配如data-01.log、data-99.log
⚠️ 异常处理说明
IOException:创建目录流时可能抛出,例如路径无效、无权限访问。DirectoryIteratorException:在迭代过程中出现异常,会被封装成此异常类型。根本原因可以通过getCause()访问。
} catch (DirectoryIteratorException e) {
System.err.println("Iterate failed: " + e.getCause());
}
📌 小结对比:常用目录操作方式
| 操作目标 | 使用方法 |
|---|---|
| 列出所有文件和子目录 | Files.newDirectoryStream() |
| 仅列出特定扩展名的文件 | Files.newDirectoryStream(dir, "*.txt") |
| 自动关闭目录流资源 | 使用 try-with-resources |
| 获取文件名 | entry.getFileName() |
| 获取完整路径 | entry.toAbsolutePath() |
| 捕获迭代异常 | 捕获 DirectoryIteratorException |