Java java.nio.file.Files 类
java.nio.file.Files
是 Java NIO (New I/O) 包中的一个实用工具类,位于 java.nio.file
包中。
java.nio.file.Files
提供了一系列静态方法来操作文件系统中的文件和目录,大大简化了文件 I/O 操作。
主要特点
- 静态方法:所有方法都是静态的,无需创建实例
- 功能丰富:提供文件读写、属性操作、目录遍历等多种功能
- 异常处理:统一使用
IOException
处理文件操作异常 - 与 Path 配合:主要与
java.nio.file.Path
接口一起使用
常用方法分类
文件操作
文件读写
实例
// 读取文件所有行
List<String> lines = Files.readAllLines(path);
// 写入文件
Files.write(path, content.getBytes());
// 追加写入
Files.write(path, content.getBytes(), StandardOpenOption.APPEND);
List<String> lines = Files.readAllLines(path);
// 写入文件
Files.write(path, content.getBytes());
// 追加写入
Files.write(path, content.getBytes(), StandardOpenOption.APPEND);
文件复制/移动/删除
实例
// 复制文件
Files.copy(sourcePath, targetPath);
// 移动/重命名文件
Files.move(sourcePath, targetPath);
// 删除文件
Files.delete(path);
Files.copy(sourcePath, targetPath);
// 移动/重命名文件
Files.move(sourcePath, targetPath);
// 删除文件
Files.delete(path);
目录操作
创建目录
实例
// 创建单级目录
Files.createDirectory(path);
// 创建多级目录
Files.createDirectories(path);
Files.createDirectory(path);
// 创建多级目录
Files.createDirectories(path);
目录遍历
实例
// 遍历目录
try (Stream<Path> paths = Files.list(directoryPath)) {
paths.forEach(System.out::println);
}
// 递归遍历目录
try (Stream<Path> paths = Files.walk(directoryPath)) {
paths.forEach(System.out::println);
}
try (Stream<Path> paths = Files.list(directoryPath)) {
paths.forEach(System.out::println);
}
// 递归遍历目录
try (Stream<Path> paths = Files.walk(directoryPath)) {
paths.forEach(System.out::println);
}
文件属性操作
获取文件属性
实例
// 检查文件是否存在
boolean exists = Files.exists(path);
// 获取文件大小
long size = Files.size(path);
// 获取文件最后修改时间
FileTime lastModifiedTime = Files.getLastModifiedTime(path);
boolean exists = Files.exists(path);
// 获取文件大小
long size = Files.size(path);
// 获取文件最后修改时间
FileTime lastModifiedTime = Files.getLastModifiedTime(path);
设置文件属性
实例
// 设置文件最后修改时间
Files.setLastModifiedTime(path, FileTime.fromMillis(System.currentTimeMillis()));
// 设置文件权限
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
Files.setPosixFilePermissions(path, perms);
Files.setLastModifiedTime(path, FileTime.fromMillis(System.currentTimeMillis()));
// 设置文件权限
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
Files.setPosixFilePermissions(path, perms);
高级功能
文件查找
实例
// 查找特定扩展名的文件
try (Stream<Path> paths = Files.find(
directoryPath,
Integer.MAX_VALUE,
(path, attrs) -> path.toString().endsWith(".txt"))) {
paths.forEach(System.out::println);
}
try (Stream<Path> paths = Files.find(
directoryPath,
Integer.MAX_VALUE,
(path, attrs) -> path.toString().endsWith(".txt"))) {
paths.forEach(System.out::println);
}
临时文件操作
实例
// 创建临时文件
Path tempFile = Files.createTempFile("prefix", ".suffix");
// 创建临时目录
Path tempDir = Files.createTempDirectory("tempDir");
Path tempFile = Files.createTempFile("prefix", ".suffix");
// 创建临时目录
Path tempDir = Files.createTempDirectory("tempDir");
文件属性视图
实例
// 获取文件所有者
UserPrincipal owner = Files.getOwner(path);
// 获取文件存储信息
FileStore store = Files.getFileStore(path);
UserPrincipal owner = Files.getOwner(path);
// 获取文件存储信息
FileStore store = Files.getFileStore(path);
最佳实践
异常处理
实例
try {
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.err.println("文件操作失败: " + e.getMessage());
}
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.err.println("文件操作失败: " + e.getMessage());
}
资源清理
实例
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println);
} // 自动关闭流
lines.forEach(System.out::println);
} // 自动关闭流
性能考虑
- 对于大文件,使用缓冲流 (
Files.newBufferedReader
/Files.newBufferedWriter
) - 批量操作时考虑使用
Files.walk
而非递归调用 - 频繁访问的属性可以缓存
与传统 I/O 的比较
特性 | Files 类 (NIO) | 传统 I/O (java.io) |
---|---|---|
方法类型 | 静态方法 | 实例方法 |
路径表示 | 使用 Path 接口 | 使用 File 类 |
异常处理 | 统一使用 IOException | 多种异常类型 |
功能丰富度 | 更丰富的功能 | 基础功能 |
符号链接处理 | 原生支持 | 有限支持 |
文件属性操作 | 更全面 | 有限 |
通过 Files
类,Java 提供了更现代、更强大的文件操作 API,推荐在新项目中使用它替代传统的 java.io.File
类。
点我分享笔记