Java NIO 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 接口一起使用

常用方法分类

注意:许多方法会抛出 IOException,使用时需要进行异常处理。

以下是 java.nio.file.Files 类的常用方法:

方法 描述
文件操作
static Path copy(Path source, Path target, CopyOption... options) 将文件从源路径复制到目标路径
static Path move(Path source, Path target, CopyOption... options) 移动或重命名文件
static void delete(Path path) 删除文件
static boolean deleteIfExists(Path path) 如果文件存在则删除
文件属性
static boolean exists(Path path, LinkOption... options) 检查文件是否存在
static boolean isDirectory(Path path, LinkOption... options) 检查路径是否为目录
static boolean isRegularFile(Path path, LinkOption... options) 检查路径是否为常规文件
static boolean isReadable(Path path) 检查文件是否可读
static boolean isWritable(Path path) 检查文件是否可写
static boolean isExecutable(Path path) 检查文件是否可执行
static long size(Path path) 返回文件大小(字节)
static FileTime getLastModifiedTime(Path path, LinkOption... options) 获取文件最后修改时间
文件内容操作
static byte[] readAllBytes(Path path) 读取文件所有字节
static List<String> readAllLines(Path path) 读取文件所有行
static List<String> readAllLines(Path path, Charset cs) 用指定字符集读取文件所有行
static Stream<String> lines(Path path) 返回文件中行的流
static Stream<String> lines(Path path, Charset cs) 用指定字符集返回文件中行的流
static Path write(Path path, byte[] bytes, OpenOption... options) 将字节写入文件
static Path write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options) 将文本行写入文件
目录操作
static Stream<Path> list(Path dir) 列出目录中的条目
static DirectoryStream<Path> newDirectoryStream(Path dir) 打开目录流
static Path createDirectory(Path dir, FileAttribute<?>... attrs) 创建目录
static Path createDirectories(Path dir, FileAttribute<?>... attrs) 创建目录(包括所有不存在的父目录)
临时文件/目录
static Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs) 创建临时文件
static Path createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs) 创建临时目录
其他
static Path createFile(Path path, FileAttribute<?>... attrs) 创建新文件
static SeekableByteChannel newByteChannel(Path path, OpenOption... options) 打开或创建文件,返回可查找的字节通道
static InputStream newInputStream(Path path, OpenOption... options) 打开文件输入流
static OutputStream newOutputStream(Path path, OpenOption... options) 打开文件输出流
static BufferedReader newBufferedReader(Path path) 打开缓冲读取器
static BufferedWriter newBufferedWriter(Path path, OpenOption... options) 打开缓冲写入器
static String probeContentType(Path path) 探测文件内容类型

1、文件操作

文件读写

实例

// 读取文件所有行
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);

2、目录操作

创建目录

实例

// 创建单级目录
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);
}

3、文件属性操作

获取文件属性

实例

// 检查文件是否存在
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);

高级功能

1、文件查找

实例

// 查找特定扩展名的文件
try (Stream<Path> paths = Files.find(
        directoryPath,
        Integer.MAX_VALUE,
        (path, attrs) -> path.toString().endsWith(".txt"))) {
    paths.forEach(System.out::println);
}

2、临时文件操作

实例

// 创建临时文件
Path tempFile = Files.createTempFile("prefix", ".suffix");

// 创建临时目录
Path tempDir = Files.createTempDirectory("tempDir");

3、文件属性视图

实例

// 获取文件所有者
UserPrincipal owner = Files.getOwner(path);

// 获取文件存储信息
FileStore store = Files.getFileStore(path);

最佳实践

1、异常处理

实例

try {
    Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    System.err.println("文件操作失败: " + e.getMessage());
}

2、资源清理

实例

try (Stream<String> lines = Files.lines(path)) {
    lines.forEach(System.out::println);
} // 自动关闭流

3、性能考虑

  • 对于大文件,使用缓冲流 (Files.newBufferedReader/Files.newBufferedWriter)
  • 批量操作时考虑使用 Files.walk 而非递归调用
  • 频繁访问的属性可以缓存

与传统 I/O 的比较

特性 Files 类 (NIO) 传统 I/O (java.io)
方法类型 静态方法 实例方法
路径表示 使用 Path 接口 使用 File 类
异常处理 统一使用 IOException 多种异常类型
功能丰富度 更丰富的功能 基础功能
符号链接处理 原生支持 有限支持
文件属性操作 更全面 有限

通过 Files 类,Java 提供了更现代、更强大的文件操作 API,推荐在新项目中使用它替代传统的 java.io.File 类。