简介
Java NIO.2 是 Java 7 引入的新一代文件系统 API,java.nio.file
是它的核心包,功能上远超 java.io.File
,提供了:
- 更强大的路径处理能力(跨平台)
- 文件读写、复制、移动、删除等操作
- 文件系统访问
- 符号链接支持
- 文件监控(WatchService)
核心类
类/接口名 | 简介 |
---|
Path (接口) | 抽象表示一个路径,替代 File |
~~Paths~~ (类) | 工具类,用于创建 ~~Path~~ 对象 |
Files (类) | 文件和目录操作的工具类(全部为静态方法) |
FileSystem | 表示整个文件系统,可获取根路径等 |
FileSystems | 获取 FileSystem 的工厂类 |
StandardOpenOption | 用于指定打开文件时的选项(读、写、追加、创建等) |
LinkOption | 是否跟随符号链接 |
StandardCopyOption | 复制/移动文件时的选项 |
WatchService | 文件系统事件监听服务 |
WatchKey | 表示一个可轮询的事件键 |
WatchEvent | 表示目录变更事件 |
DirectoryStream | 更传统地迭代目录内容 |
BasicFileAttributes | 获取文件属性(大小、时间、是否为目录等) |
常用核心类
Path 与 Paths
创建 Path 实例
Path path1 = Paths.get("file.txt");
Path path2 = Paths.get("/home/user/file.txt");
Path path3 = Paths.get("folder", "sub", "file.txt");
常用方法
path.getFileName();
path.getParent();
path.getRoot();
path.toAbsolutePath();
path.normalize();
path.resolve("other");
path.relativize(other);
path.startsWith("/");
Files 类功能总结
文件读写
Files.readAllBytes(path);
Files.readAllLines(path);
Files.write(path, bytes);
Files.write(path, bytes, StandardOpenOption.APPEND);
文件管理
Files.exists(path);
Files.isDirectory(path);
Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING);
Files.move(src, dest);
Files.delete(path);
创建文件/目录
Files.createFile(path);
Files.createDirectory(path);
Files.createDirectories(path);
获取文件属性
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
attrs.size();
attrs.creationTime();
attrs.lastModifiedTime();
遍历文件夹
try (Stream<Path> stream = Files.list(path)) {stream.forEach(System.out::println);
}
深度遍历(递归)
Files.walk(path).filter(Files::isRegularFile).forEach(System.out::println);
StandardOpenOption(文件写入控制)
枚举常量 | 含义 |
---|
WRITE | 写入文件 |
APPEND | 追加写入 |
CREATE | 文件不存在则创建 |
CREATE_NEW | 文件存在则抛异常 |
TRUNCATE_EXISTING | 清空文件 |
READ | 读取 |
文件系统操作(FileSystem / FileSystems)
FileSystem fs = FileSystems.getDefault();
Path root = fs.getPath("/");
Iterable<Path> roots = fs.getRootDirectories();
可以用于获取多个挂载点(如 C:\、D:\)
文件监控(WatchService)
Path dir = Paths.get(".");
WatchService watcher = FileSystems.getDefault().newWatchService();
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);while (true) {WatchKey key = watcher.take();for (WatchEvent<?> event : key.pollEvents()) {System.out.println("Event kind: " + event.kind());System.out.println("File affected: " + event.context());}key.reset();
}
应用场景示例
递归删除目录
Files.walk(path).sorted(Comparator.reverseOrder()) .forEach(Files::delete);
搜索特定扩展名文件
Files.walk(Paths.get(".")).filter(p -> p.toString().endsWith(".java")).forEach(System.out::println);
读取大文件推荐方式(逐行)
try (BufferedReader reader = Files.newBufferedReader(path)) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
}
易错点提示
问题场景 | 建议 |
---|
符号链接问题 | 用 LinkOption.NOFOLLOW_LINKS 判断属性 |
文件已存在时写入失败 | 使用 StandardOpenOption.CREATE 或覆盖选项 |
文件不存在时报错 | 使用 Files.exists() 检查后处理 |
删除非空目录失败 | 使用 walk 并排序后从叶节点开始删除 |
学习建议
- 建议掌握
Path
+ Files
+ StandardOpenOption
的配套使用方式 - 学习使用
try-with-resources
来管理 Stream<Path>
等资源 - WatchService 是做日志监控、自动部署等实用场景的关键工具
- Java 的 NIO 文件 API 已足够替代老旧的
File
类,建议优先使用