399. Java 文件操作基础 - 文本文件字符集处理

28 阅读2分钟

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️⃣ 核心讲解点

  1. BufferedReader / BufferedWriter
    • 自动处理字符集转换
    • 支持按行读取或写入文本
  2. Charset 管理
    • Java SE 17 及之前:字符流自动适配本地字符集
    • Java SE 18 及以后:默认 UTF-8
  3. try-with-resources
    • 自动关闭文件流,避免资源泄漏 ✅