文本文件读取:把字符集写在接口边界
同一文件在开发机正常,在另一台机器上出现乱码,往往是因为依赖了隐含字符集或文件来源没有约定编码。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Full Course
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
同一文件在开发机正常,在另一台机器上出现乱码,往往是因为依赖了隐含字符集或文件来源没有约定编码。
理解核心机制
文件里保存的是字节,String 保存的是字符序列,两者通过字符集转换。使用 Files.readString 时可以显式指定 UTF-8,让输入协议清楚可见;大文件则需要流式处理。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
public class Demo {
public static void main(String[] args) throws Exception {
var path = Files.createTempFile("wmx-note", ".txt");
try {
Files.writeString(path, "你好,Java", StandardCharsets.UTF_8);
System.out.println(Files.readString(path, StandardCharsets.UTF_8));
} finally { Files.deleteIfExists(path); }
}
}适用边界与常见误区
整个文件读成字符串会占用与文件规模相关的内存。字符集正确也不代表 CSV、JSON 等上层格式已经被正确解析。
继续练习
查看同一段中文在 UTF-8 下的字节长度与 String.length,说明为什么字节数不能直接当作字符数。