要让inputstreamreader正确读取gbk编码文件,必须显式指定"gbk"字符集,否则用平台默认编码会导致中文乱码;推荐搭配bufferedreader和try-with-resources使用,并先验证文件真实编码。

要让 InputStreamReader 正确读取 GBK 编码的文本文件,关键在于**显式指定字符集为 "GBK"**,否则它会使用平台默认编码(如 UTF-8 或 ISO-8859-1),导致中文乱码。
确保使用 GBK 字符集构造 InputStreamReader
直接传入 "GBK" 字符集名称(大小写不敏感,但推荐大写),避免依赖系统默认编码:
- ✅ 正确写法:
new InputStreamReader(new FileInputStream("file.txt"), "GBK") - ❌ 错误写法:
new InputStreamReader(new FileInputStream("file.txt"))(用默认编码,极易乱码) - ⚠️ 注意:
"GB2312"和"GBK"不完全兼容;若文件含扩展汉字(如生僻姓名、古籍字),必须用"GBK",否则可能抛MalformedInputException或静默替换为
配合 BufferedReader 提升读取效率和便利性
InputStreamReader 本身只做解码,不带缓冲。实际使用中建议套一层 BufferedReader,支持按行读取:
try (FileInputStream fis = new FileInputStream("data.txt");
InputStreamReader isr = new InputStreamReader(fis, "GBK");
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 中文正常显示
}
}
使用 try-with-resources 自动关闭流,防止资源泄漏。
验证文件真实编码,避免“以为是 GBK 实际不是”
乱码不一定源于代码——先确认文件确实是 GBK 编码:
- 用记事本打开 → “另存为”,看右下角编码提示(如“ANSI”在简体中文 Windows 下通常对应 GBK)
- 用 VS Code / Notepad++ 打开,查看右下角状态栏显示的编码(如 “GBK”、“GB2312”、“UTF-8 with BOM”)
- 命令行检测(Linux/macOS):
file -i filename.txt或enca filename.txt
如果文件是 UTF-8 编码却硬设 GBK,也会出现乱码(如把 UTF-8 的三字节序列当 GBK 双字节解析),结果不可逆。
替代方案:Java 7+ 推荐用 Files.newBufferedReader
更简洁、不易出错,底层自动处理编码和资源关闭:
Path path = Paths.get("data.txt");
try (BufferedReader br = Files.newBufferedReader(path, Charset.forName("GBK"))) {
br.lines().forEach(System.out::println);
}
注意:Charset.forName("GBK") 比字符串字面量更类型安全,且可提前捕获不支持编码的异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











