399. Java 文件操作基础 - 文本文件字符集处理
在 Java 中,java.nio.file 包提供了 通道(Channel)I/O 支持,它通过缓冲区(Buffer)直接移动数据,绕过了一些可能导致性能瓶颈的流层(Stream I/O),尤其在大文件操作时性能更佳。
1️⃣ 理解字符处理(Character Handling)
Java 平台内部使用 Unicode 来存储字符。
- 当你使用字符流(Character Stream)进行 I/O 操作时,Java 会自动完成 Unicode ↔ 本地字符集 的转换。
- 在西方地区,本地字符集通常是 8 位的 ASCII 超集 或 UTF-8。
💡 小贴士:
- 通过字符流进行读写时,Java 会自动处理字符集,程序无需手动干预。
- 从 Java SE 18 开始,Java 默认使用 UTF-8 作为应用程序的字符集。
2️⃣ 国际化与字符集
- 如果你的程序不需要国际化支持,只需直接使用字符流即可,不必担心字符集问题。
- 如果以后程序需要支持多语言或国际化,再做适配也很方便,无需大规模重写代码。
3️⃣ 示例讲解
假设我们有一个文本文件 example.txt,要 读取并写入文本,可以使用 Files.newBufferedReader() 和 Files.newBufferedWriter():
import java.nio.file.*;
import java.nio.charset.Charset;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
public class TextFileExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
// 使用 UTF-8 读取文件
try (BufferedReader reader = Files.newBufferedReader(path, Charset.forName("UTF-8"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("读取到: " + line);
}
} catch (IOException e) {
System.err.println("读取文件异常: " + e.getMessage());
}
// 使用 UTF-8 写入文件
try (BufferedWriter writer = Files.newBufferedWriter(path, Charset.forName("UTF-8"))) {
writer.write("这是写入的示例文本。\n");
writer.write("第二行文本。");
System.out.println("写入完成!");
} catch (IOException e) {
System.err.println("写入文件异常: " + e.getMessage());
}
}
}
4️⃣ 核心讲解点
- BufferedReader / BufferedWriter
- 自动处理字符集转换
- 支持按行读取或写入文本
- Charset 管理
- Java SE 17 及之前:字符流自动适配本地字符集
- Java SE 18 及以后:默认 UTF-8
- try-with-resources
- 自动关闭文件流,避免资源泄漏 ✅