Java java.nio.file.Files list() 方法
java.nio.file.Files.list()
是 Java NIO(New I/O)包中提供的一个实用方法,用于列出目录中的内容。该方法返回一个 Stream<Path>
对象,包含指定目录中的所有条目(文件和子目录)。
方法定义
public static Stream<Path> list(Path dir) throws IOException
方法参数
dir 参数
- 类型:
java.nio.file.Path
- 描述:要列出内容的目录路径
- 注意事项:
- 如果参数不是目录,将抛出
NotDirectoryException
- 路径必须存在,否则会抛出
NoSuchFileException
- 如果程序没有目录的读取权限,会抛出
AccessDeniedException
- 如果参数不是目录,将抛出
返回值
Stream
- 描述:包含目录中所有条目(文件和子目录)的流
- 特性:
- 流中的元素是
Path
对象 - 流是按目录中条目的自然顺序(通常按名称排序)排列的
- 流是延迟加载的(lazy),只有在遍历时才会实际读取目录内容
- 需要正确关闭流以释放系统资源
- 流中的元素是
方法特点
1. 非递归性
list()
方法仅列出直接位于指定目录中的条目,不会递归列出子目录中的内容。
2. 不包含特殊条目
返回的流中不包含目录本身(".")和父目录("..")的条目。
3. 资源管理
由于返回的是 Stream,建议使用 try-with-resources 语句确保流被正确关闭:
实例
try (Stream<Path> stream = Files.list(Paths.get("/path/to/dir"))) {
stream.forEach(System.out::println);
}
stream.forEach(System.out::println);
}
使用示例
基本用法:列出目录内容
实例
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ListDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ListDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
进阶用法:过滤特定文件
实例
try (Stream<Path> stream = Files.list(Paths.get("/projects"))) {
stream.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
stream.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
转换为其他集合
实例
try (Stream<Path> stream = Files.list(Paths.get("/images"))) {
List<Path> imageFiles = stream.collect(Collectors.toList());
// 处理收集到的文件列表
} catch (IOException e) {
e.printStackTrace();
}
List<Path> imageFiles = stream.collect(Collectors.toList());
// 处理收集到的文件列表
} catch (IOException e) {
e.printStackTrace();
}
异常处理
Files.list()
方法可能抛出以下异常:
- NotDirectoryException - 当路径不是目录时
- NoSuchFileException - 当目录不存在时
- SecurityException - 当没有读取目录的权限时
- IOException - 发生其他 I/O 错误时
性能考虑
- 延迟加载:流是延迟加载的,只有在终端操作(如 forEach)执行时才会实际读取目录
- 资源消耗:对于包含大量文件的目录,使用流可以避免一次性加载所有条目到内存
- 并行处理:可以调用
parallel()
方法实现并行处理,但要注意线程安全问题
与类似方法的比较
方法 | 返回类型 | 递归性 | 包含特殊条目 | 备注 |
---|---|---|---|---|
Files.list() |
Stream<Path> |
否 | 否 | 推荐使用,资源友好 |
File.listFiles() |
File[] |
否 | 否 | 传统 IO 方法 |
Files.walk() |
Stream<Path> |
是 | 是 | 递归列出所有内容 |
Files.newDirectoryStream() |
DirectoryStream<Path> |
否 | 否 | 需要手动关闭 |
最佳实践
- 总是使用 try-with-resources:确保流被正确关闭
- 处理异常:妥善处理可能的 IOException
- 考虑使用过滤器:在流操作中尽早过滤不需要的条目
- 避免修改目录:在遍历目录时不要修改其内容
- 注意符号链接:默认会跟随符号链接,可能导致循环引用
总结
Files.list()
方法是 Java NIO 中处理目录内容的现代化方式,它提供了流式 API 的所有优势,包括延迟执行、链式操作和并行处理能力。对于简单的目录列表需求,它比传统的 File.listFiles()
方法更加灵活和高效。
点我分享笔记