Skip to content

Java 文件处理

文件处理是应用程序开发中的一项核心任务。从 Java 7 开始,java.nio.file 包(NIO.2)引入了一套现代、强大且易于使用的 API,用于处理文件和文件系统。本章将重点介绍这个现代 API。

Path 接口

Path 是现代文件 API 的核心,它代表一个文件或目录的路径。Path 对象是不可变的,并且与操作系统无关。

您可以通过 Paths.get() 工厂方法来创建一个 Path 对象。

java
import java.nio.file.Path;
import java.nio.file.Paths;

// 创建一个相对路径
Path relativePath = Paths.get("docs", "readme.txt");

// 创建一个绝对路径 (Windows)
// Path absolutePath = Paths.get("C:\\Users\\Guest\\Documents\\report.docx");

// 创建一个绝对路径 (macOS/Linux)
// Path absolutePath = Paths.get("/home/user/documents/report.docx");

System.out.println("文件名: " + relativePath.getFileName());
System.out.println("父目录: " + relativePath.getParent());
System.out.println("路径元素数量: " + relativePath.getNameCount());

Files 工具类

java.nio.file.Files 是一个包含大量静态方法的工具类,用于对 Path 表示的文件或目录进行操作。

检查文件/目录

  • Files.exists(path): 检查文件或目录是否存在。
  • Files.notExists(path): 检查文件或目录是否不存在。
  • Files.isDirectory(path): 检查路径是否为目录。
  • Files.isRegularFile(path): 检查路径是否为普通文件。
  • Files.isReadable(path) / isWritable(path) / isExecutable(path): 检查文件的读、写、执行权限。
java
Path p = Paths.get("example.txt");
if (Files.exists(p)) {
    System.out.println("文件存在!");
}

创建和删除文件/目录

  • Files.createFile(path): 创建一个新文件。如果文件已存在,会抛出 FileAlreadyExistsException
  • Files.createDirectory(path): 创建一个新目录。
  • Files.createDirectories(path): 创建一个目录,包括所有不存在的父目录。
  • Files.delete(path): 删除一个文件或目录。如果不存在,会抛出 NoSuchFileException
  • Files.deleteIfExists(path): 删除一个文件或目录,如果不存在也不会报错。
java
Path newDir = Paths.get("data/logs");
Path newFile = newDir.resolve("app.log"); // resolve 用于拼接路径

try {
    Files.createDirectories(newDir);
    Files.createFile(newFile);
    System.out.println("文件和目录创建成功。");
} catch (IOException e) {
    e.printStackTrace();
}

读写文件

Files 类提供了一些非常便捷的方法来读写文件,特别适合处理小文件。

  • Files.writeString(path, content, options...) (Java 11+): 将字符串写入文件。如果文件不存在,会创建它;如果存在,会覆盖内容。
  • Files.readString(path) (Java 11+): 从文件中读取所有内容并返回一个字符串。
  • Files.write(path, bytes): 将字节数组写入文件。
  • Files.readAllBytes(path): 从文件中读取所有字节。
  • Files.write(path, lines): 将一个字符串集合(行)写入文件。
  • Files.readAllLines(path): 从文件中读取所有行到一个 List<String>

示例 (Java 11+):

java
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;

Path file = Paths.get("greeting.txt");

try {
    // 写入文件
    String content = "Hello, Modern Java File I/O!";
    Files.writeString(file, content);
    System.out.println("内容已写入文件。");

    // 读取文件
    String readContent = Files.readString(file);
    System.out.println("从文件中读取的内容:");
    System.out.println(readContent);

} catch (IOException e) {
    e.printStackTrace();
}

复制和移动文件

  • Files.copy(source, target, options...): 复制文件或目录。
  • Files.move(source, target, options...): 移动或重命名文件或目录。

常用的 StandardCopyOption 包括:

  • REPLACE_EXISTING: 如果目标文件已存在,则替换它。
  • ATOMIC_MOVE: 保证移动操作是原子性的。
java
Path source = Paths.get("original.txt");
Path destination = Paths.get("backup/original_backup.txt");

try {
    // 确保备份目录存在
    Files.createDirectories(destination.getParent()); 
    // 复制文件,如果目标已存在则替换
    Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    e.printStackTrace();
}

对于大文件或需要更精细控制的场景,可以使用 BufferedReader, BufferedWriter 或流式 API,它们可以与 Files.newBufferedReader(path)Files.newBufferedWriter(path) 结合使用。

本站内容仅供学习和研究使用。