Java中使用Files.newBufferedReader和Files.newBufferedWriter时必须显式指定Charset(如StandardCharsets.UTF_8),否则依赖系统默认编码易致中文乱码或跨平台异常;读写均需匹配文件真实编码,推荐统一用UTF-8,并结合try-with-resources确保资源释放。

Java 中使用 Files.newBufferedReader 和 Files.newBufferedWriter 时,必须显式指定字符集(Charset),否则会使用系统默认编码,容易导致中文乱码或跨平台读写异常。
指定 UTF-8 读取文本文件
推荐始终用 StandardCharsets.UTF_8 显式传入,避免依赖系统默认编码:
- 调用
Files.newBufferedReader(path, StandardCharsets.UTF_8) - 返回的
BufferedReader会按 UTF-8 解码字节流 - 如果文件实际不是 UTF-8 编码(如 GBK),会解码失败或出现乱码,需按真实编码指定
指定 UTF-8 写入文本文件
写入时同样需明确 Charset,并注意是否覆盖或追加:
- 基础写入:
Files.newBufferedWriter(path, StandardCharsets.UTF_8)—— 默认覆盖原文件 - 追加写入:
Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.APPEND) - 若路径父目录不存在,会抛出
NoSuchFileException,建议提前用Files.createDirectories()创建
常见错误与规避方式
不指定 Charset 是多数乱码问题的根源:
立即学习“Java免费学习笔记(深入)”;
- 误用
Files.newBufferedReader(path)—— 实际调用系统默认 Charset(Windows 常为 GBK,Linux/macOS 常为 UTF-8) - 写入后用记事本打开显示乱码?大概率是文件存为 UTF-8,但记事本误判为 ANSI(GBK);可用 VS Code 或 Notepad++ 查看真实编码
- 读取配置文件、CSV、JSON 等标准格式时,务必统一用 UTF-8,除非明确约定其他编码(如某些旧版 Windows 日志用 GB18030)
完整示例:安全读写 UTF-8 文本
结合 try-with-resources 自动关闭,确保资源释放:
Path path = Paths.get("data.txt");
// 写入
try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
writer.write("你好,世界!");
writer.newLine();
writer.write("Hello, World!");
}
// 读取
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
不复杂但容易忽略


















