inputstreamreader需显式指定字符集以防乱码,推荐用standardcharsets常量构造;可配bufferedreader提升效率;读文件时优先用files.newbufferedreader。

在 Java 中,InputStreamReader 默认使用平台默认字符集(如 Windows 上通常是 GBK,Linux/macOS 通常是 UTF-8),若源数据实际编码与默认不一致,就会出现乱码。要正确读取,必须显式指定字符集。
构造时传入 Charset 对象(推荐)
这是最安全、可读性最好的方式,利用 StandardCharsets 中的常量,避免字符串拼写错误:
new InputStreamReader(inputStream, StandardCharsets.UTF_8)new InputStreamReader(inputStream, StandardCharsets.GBK)new InputStreamReader(inputStream, StandardCharsets.ISO_8859_1)
构造时传入字符集名称字符串
也可以用字符串指定,但需确保名称拼写准确(区分大小写,空格敏感),否则会抛 UnsupportedEncodingException:
new InputStreamReader(inputStream, "UTF-8")new InputStreamReader(inputStream, "GBK")new InputStreamReader(inputStream, "ISO-8859-1")
注意:"UTF8"(无横线)是无效名称,必须写成 "UTF-8"。
配合 BufferedReader 提升效率
InputStreamReader 本身不带缓冲,建议包装为 BufferedReader 再读取:
try (InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(reader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
从文件路径直接创建(Java 7+)
如果源头是文件,更推荐跳过 InputStreamReader,直接用 Files.newBufferedReader,它内部已封装好指定编码:
Files.newBufferedReader(Paths.get("data.txt"), StandardCharsets.UTF_8)- 自动处理资源关闭(配合 try-with-resources),代码更简洁、不易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











