必须显式指定文件读写编码,禁用系统默认:读用inputstreamreader+standardcharsets.utf_8,写用outputstreamwriter+utf_8;推荐files工具类,大文件慎用readalllines;编码选择依来源定,新项目用utf-8,旧文件查编辑器标识或文档。

关键就一条:读写文件时,必须显式指定编码,不能依赖系统默认。
读文件时强制指定编码
FileReader 用的是系统默认编码,极易出错。正确做法是用 InputStreamReader 包一层,并传入明确的 Charset。
- 推荐使用 StandardCharsets.UTF_8,兼容性好、覆盖全
- 如果确定文件是 GBK(比如旧 Windows 日志),就写 "GBK" 或 "GB2312"
- 代码示例:
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8));
写文件时也要配对指定编码
FileWriter 同样走默认编码,写出来别人读不了。务必通过 OutputStreamWriter 统一控制输出编码。
- 写入前确认目标环境能接受该编码(如 Linux 服务器优先 UTF-8)
- 避免混用:写用 UTF-8,读也必须用 UTF-8,否则字节流一解码就错
- 代码示例:
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8));
更简洁现代的写法(Java 7+)
Files 工具类封装了底层细节,语义清晰、不易出错。
- 写文件:
Files.write(Paths.get("msg.txt"), "你好".getBytes(StandardCharsets.UTF_8)); - 读文件:
Listlines = Files.readAllLines(Paths.get("msg.txt"), StandardCharsets.UTF_8); - 注意:readAllLines 会一次性加载全部内容,大文件慎用
怎么判断该用什么编码?
没有万能猜测法,得结合来源确认:
- 新项目、跨平台协作 → 默认选 UTF-8
- 读取历史文件(如 Excel 导出的 CSV、记事本保存的 txt)→ 先用编辑器(如 VS Code、Notepad++)打开看右下角编码标识
- 对接老系统或第三方接口 → 查文档,或让对方提供样本文件并告知编码
- 不确定时可试读前几行,对比不同编码下的显示效果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











