java.nio.file.Files.list() 是 Java NIO(New I/O)包中提供的一个实用方法,用于列出目录中的内容。该方法返回一个 Stream<Path> 对象,包含指定目录中的所有条目(文件和子目录)。
方法定义
方法参数
dir 参数
返回值
Stream
方法特点
1. 非递归性
list() 方法仅列出直接位于指定目录中的条目,不会递归列出子目录中的内容。
2. 不包含特殊条目
返回的流中不包含目录本身(".")和父目录("..")的条目。
3. 资源管理
由于返回的是 Stream,建议使用 try-with-resources 语句确保流被正确关闭:
实例
使用示例
基本用法:列出目录内容
进阶用法:过滤特定文件
转换为其他集合
异常处理
Files.list() 方法可能抛出以下异常:
1、NotDirectoryException - 当路径不是目录时
2、NoSuchFileException - 当目录不存在时
3、SecurityException - 当没有读取目录的权限时
4、IOException - 发生其他 I/O 错误时
性能考虑
1、延迟加载:流是延迟加载的,只有在终端操作(如 forEach)执行时才会实际读取目录
2、资源消耗:对于包含大量文件的目录,使用流可以避免一次性加载所有条目到内存
3、并行处理:可以调用 parallel() 方法实现并行处理,但要注意线程安全问题
与类似方法的比较
Files.list()
Stream<Path>
File.listFiles()
File[]
Files.walk()
Files.newDirectoryStream()
DirectoryStream<Path>
最佳实践
1、总是使用 try-with-resources:确保流被正确关闭
2、处理异常:妥善处理可能的 IOException
3、考虑使用过滤器:在流操作中尽早过滤不需要的条目
4、避免修改目录:在遍历目录时不要修改其内容
5、注意符号链接:默认会跟随符号链接,可能导致循环引用
总结
Files.list() 方法是 Java NIO 中处理目录内容的现代化方式,它提供了流式 API 的所有优势,包括延迟执行、链式操作和并行处理能力。对于简单的目录列表需求,它比传统的 File.listFiles() 方法更加灵活和高效。