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) 结合使用。