显式指定 utf-8 编码读取文本文件可避免系统默认编码(如 windows 的 gbk)导致的乱码,确保中文、emoji 等正确解析;推荐用 files.readalllines()(中小文件)、files.readstring()(小型纯文本)或 bufferedreader + inputstreamreader(大文件/定制处理),禁用 filereader。

读取文本文件时显式指定 UTF-8 编码,核心是避免依赖系统默认编码(如 Windows 的 GBK),确保 Java 按 UTF-8 规则解码字节流。只要编码声明与文件实际保存格式一致,中文、emoji、特殊符号就不会变乱码。
用 Files.readAllLines() 一行读全部行
适合中小文件(建议 ≤100 MB),代码简洁且自动管理资源:
- 必须传入 StandardCharsets.UTF_8,不能省略
- Java 11+ 虽默认 UTF-8,但显式指定更安全、可读性更强
- 示例:List
lines = Files.readAllLines(Paths.get("data.txt"), StandardCharsets.UTF_8);
用 Files.readString() 读整个文件内容
适用于小型纯文本(如配置、JSON、日志片段,几 MB 内):
- Java 11 引入,一行拿到全部字符串
- 默认就是 UTF-8,但若想明确表达意图或未来兼容性,仍推荐显式传参
- 示例:String content = Files.readString(Paths.get("config.json"), StandardCharsets.UTF_8);
用 BufferedReader + InputStreamReader 手动控制
适合大文件、需逐行处理、或要捕获特定异常/跳过空行等逻辑的场景:
- 必须用 InputStreamReader 包装 FileInputStream,并传入 StandardCharsets.UTF_8
- 不要直接用 FileReader —— 它隐式使用系统默认编码,极易跨平台出错
- 示例:try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("log.txt"), StandardCharsets.UTF_8))) { ... }
注意:别踩这些坑
- FileReader("a.txt") 是危险写法,JDK 11+ 虽支持带 Charset 构造器,但老版本不兼容,统一用 InputStreamReader 更稳妥
- 如果文件其实是 GBK 或 ISO-8859-1 编码,硬设 UTF-8 会读成乱码 —— 编码声明必须和源文件一致
- 读取后内容本身不含编码信息,后续输出(如打印、写入新文件)仍需按需指定编码,避免二次乱码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











