InputStreamReader 是将字节流按指定编码解码为字符流的桥梁类,须显式指定编码(推荐 StandardCharsets.UTF_8),常与 BufferedReader 套用以支持按行读取和提升性能,并通过 try-with-resources 确保资源安全关闭。

InputStreamReader 是 Java 中用于将字节流(InputStream)按指定字符编码解码为字符流(Reader)的桥梁类。它的核心作用是解决“字节 → 字符”的转换问题,避免因编码不匹配导致的乱码。
明确指定字符编码,避免平台默认编码陷阱
不带编码参数的构造方法会使用系统默认编码(如 Windows 上常为 GBK,Linux/macOS 多为 UTF-8),极易引发跨环境乱码。务必显式传入编码名:
- 推荐使用
StandardCharsets.UTF_8(Java 7+),类型安全、无异常风险 - 也可用字符串
"UTF-8",但需捕获UnsupportedEncodingException - 常见编码还有
ISO-8859-1、GBK、UTF-16等,需与源数据实际编码一致
配合 InputStream 正确创建 InputStreamReader 实例
通常以文件、网络或标准输入等字节流为源头,包装成 InputStreamReader:
- 读取文件:
new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8) - 读取网络响应体(如 HttpURLConnection):
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8) - 读取控制台输入:
new InputStreamReader(System.in, StandardCharsets.UTF_8)
搭配 BufferedReader 提升读取效率和功能
InputStreamReader 本身只支持逐字符(read())或批量字符(read(char[]))读取,建议再套一层 BufferedReader:
- 支持按行读取
readLine(),处理文本更自然 - 内部带缓冲,减少底层 I/O 调用次数,性能更好
- 示例:
BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))
注意资源及时关闭,防止字节丢失或句柄泄漏
InputStreamReader 本身不自动刷新或清空缓冲区,关闭时需确保上层流也关闭:
- 使用 try-with-resources 最安全:
try (InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(isr)) { ... } - 关闭
BufferedReader会自动关闭其包装的InputStreamReader,进而关闭底层InputStream - 若手动关闭,须按“从外到内”顺序:先关
BufferedReader,再关InputStreamReader(非必须),最后关原始InputStream


















