Java读写文件时必须显式指定字符编码(如StandardCharsets.UTF_8),禁用系统默认编码,否则跨平台易乱码;推荐Files.write()或OutputStreamWriter+FileOutputStream组合写入,Files.readAllLines()或InputStreamReader+BufferedReader组合读取,并统一使用StandardCharsets常量确保类型安全。

Java 中读写文件时指定字符编码,核心是避免使用默认平台编码(容易出乱码),而是显式传入 Charset 或其名称字符串(如 "UTF-8")。
写文件时指定编码格式
推荐使用 Files.write() 或带 OutputStreamWriter 的方式,确保写入内容按目标编码转为字节:
- 用
Files.write():直接传StandardCharsets.UTF_8
String content = "你好,世界!";
Files.write(Paths.get("output.txt"), content.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE);
- 更安全的方式是配合
BufferedWriter+OutputStreamWriter,便于控制换行和异常处理
try (Writer w = new OutputStreamWriter(
new FileOutputStream("output.txt"), StandardCharsets.GBK)) {
w.write("中文内容");
}
读文件时指定编码格式
读取文本文件必须明确告知 Java 文件原本用什么编码保存,否则用系统默认编码解析会乱码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Files.readAllLines()或Files.lines()时,第二个参数传Charset
List<String> lines = Files.readAllLines(Paths.get("input.txt"), StandardCharsets.UTF_8);
- 用
BufferedReader时,包装InputStreamReader并指定编码
try (Reader r = new InputStreamReader(
new FileInputStream("input.txt"), StandardCharsets.ISO_8859_1)) {
BufferedReader br = new BufferedReader(r);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
注意编码名称的写法
Java 支持标准编码名(大小写不敏感),但建议统一用常量或规范字符串:
立即学习“Java免费学习笔记(深入)”;
- 优先用
StandardCharsets.UTF_8、StandardCharsets.GBK等常量——类型安全、无拼写错误风险 - 避免硬写字符串如
"utf8"(缺少短横线,部分旧 JDK 可能不识别),应写"UTF-8" -
GBK和GB2312不同:GBK 是超集,支持更多汉字;若文件由 Windows 记事本“另存为 ANSI”生成,实际可能是 GBK(取决于系统区域设置)
常见陷阱与验证方法
即使指定了编码,仍可能乱码,需排查源头:
- 确认文件本身确实是该编码——可用编辑器(如 VS Code、Notepad++)查看并重新以正确编码打开验证
- IDE 运行配置里也要设 VM options:
-Dfile.encoding=UTF-8,避免System.getProperty("file.encoding")影响某些 API - 日志或控制台输出乱码?那是终端/IDE 控制台编码问题,和文件读写无关,需单独调整终端编码设置

















