推荐在创建inputstreamreader时显式指定standardcharsets.utf_8编码,以确保utf-8字节正确解码为字符,避免平台默认编码导致乱码;配合fileinputstream读取utf-8文本文件可正确显示中文和emoji;若源数据非utf-8则仍会乱码,需确认实际编码;java 8+可优先使用files.lines()简化操作。

直接在创建 InputStreamReader 时指定 "UTF-8" 编码即可,这是最常用也最推荐的方式。
构造时显式指定 UTF-8 编码
避免依赖平台默认编码,确保字节到字符的转换严格按 UTF-8 解码:
- 使用带
Charset参数的构造方法(推荐,类型安全):
InputStreamReader reader = new InputStreamReader(inputStream, utf8);
- 或使用字符串编码名(兼容老版本 Java):
⚠️ 注意:传入非法编码名(如 "UTP-8")会抛出 UnsupportedEncodingException,建议用 StandardCharsets.UTF_8 更安全。
配合 FileInputStream 读取 UTF-8 文本文件
典型场景:读取保存为 UTF-8 的 .txt 文件:
InputStreamReader reader = new InputStreamReader(fis, StandardCharsets.UTF_8)) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
}
这样能正确解析中文、emoji 等 UTF-8 多字节字符,不会出现乱码或 替换符。
注意输入流本身必须是 UTF-8 编码的字节
InputStreamReader 只负责解码,不改变原始字节。如果源数据不是 UTF-8(比如 GBK 编码的文件),强行用 UTF-8 解码仍会乱码:
- 确认文件/网络响应的实际编码(可借助工具如
file -i filename或 IDE 编码提示) - HTTP 响应需检查
Content-Type中的charset=utf-8 - 写入端也要用 UTF-8(如
OutputStreamWriter同样指定UTF-8)才能端到端一致
替代方案:用 Files.lines() 更简洁(Java 8+)
若只是逐行读文本文件,无需手动管理流:
try (Streamlines.forEach(System.out::println);
}
底层仍用 InputStreamReader + UTF-8,但封装更安全、自动关闭资源。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











