inputstreamreader和outputstreamwriter是字节流与字符流之间的桥梁:前者将inputstream按指定编码解码为reader,后者将writer按指定编码编码为outputstream;均需显式指定字符集(如utf-8)以避免乱码,且常与bufferedreader/bufferedwriter组合提升效率。

Java 中通过 转换流(InputStreamReader 和 OutputStreamWriter)实现字节流与字符流之间的平滑切换。它们是桥接类,底层封装字节流,对外提供字符操作接口,同时支持指定字符集,避免乱码。
InputStreamReader:字节输入流 → 字符输入流
它把 InputStream(如 FileInputStream、Socket.getInputStream())按指定编码解码为字符流,供 Reader 方法读取。
- 构造时必须传入字节输入流,推荐显式指定字符集(如
"UTF-8"),避免依赖平台默认编码 - 可配合
BufferedReader提升读取效率,支持按行读取(readLine()) - 示例:new InputStreamReader(new FileInputStream("data.txt"), "UTF-8")
OutputStreamWriter:字节输出流 → 字符输出流
它把 Writer 写入的字符,按指定编码编码为字节,写入底层 OutputStream(如 FileOutputStream、Socket.getOutputStream())。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 同样建议显式指定字符集,否则可能因平台差异导致写入内容无法被正确读取
- 可包装在
BufferedWriter中,提升写入性能并支持换行等便捷操作 - 示例:new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8")
关键细节:编码一致性决定是否“平滑”
所谓“平滑切换”,核心在于读写两端使用相同的字符集。若写入用 GBK,读取用 UTF-8,必然出现乱码——转换流本身不纠错,只忠实地执行编码/解码。
- 推荐统一使用
"UTF-8",兼容性好,覆盖绝大多数场景 - 可通过
getEncoding()方法检查当前实际使用的编码(可能因传入 null 而回退到系统默认) - 注意:转换流本身不缓冲,需手动包装
BufferedReader/BufferedWriter才能获得高效读写能力
典型组合写法(兼顾安全与效率)
生产代码中通常这样搭配使用:
- 读文件:new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), "UTF-8"))
- 写文件:new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"), "UTF-8"))
- JDK 7+ 可用 try-with-resources 自动关闭所有层级流,防止资源泄漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










