Java中字节流转字符流需用InputStreamReader或OutputStreamWriter桥接,必须显式指定编码(如"UTF-8")以避免乱码,推荐配合BufferedReader/BufferedWriter提升效率与功能。

Java 中字节流转换为字符流,核心是使用 InputStreamReader(输入)或 OutputStreamWriter(输出),它们是桥接字节流与字符流的转换器,负责按指定字符编码将字节解码为字符(或反之)。
用 InputStreamReader 包装字节输入流
这是最常见的方式,把 InputStream(如 FileInputStream、System.in)转为可读取字符串的 Reader:
- 必须显式指定字符编码(如
"UTF-8"),否则依赖平台默认编码,易导致乱码 - 推荐使用带编码名的构造方法,避免使用无参构造(隐式调用
Charset.defaultCharset()) - 可进一步包装成
BufferedReader提升读取效率,支持按行读取
示例:
InputStream is = new FileInputStream("data.txt");
Reader reader = new InputStreamReader(is, "UTF-8"); // 关键:指定编码
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
用 OutputStreamWriter 包装字节输出流
将 Writer 的字符写入操作,转为底层字节流(如 FileOutputStream)的实际写入:
立即学习“Java免费学习笔记(深入)”;
- 同样必须指定编码,确保写入的字节能被正确解读
- 写入后记得调用
flush()或close(),防止缓冲区内容未写出 - 可配合
BufferedWriter提高性能,支持换行等便捷操作
示例:
OutputStream os = new FileOutputStream("output.txt");
Writer writer = new OutputStreamWriter(os, "UTF-8");
BufferedWriter bw = new BufferedWriter(writer);
bw.write("你好,世界!");
bw.newLine();
bw.flush();
bw.close();
注意编码一致性
字节流本身不包含编码信息,转换时的编码参数必须与源数据实际编码一致,否则必然乱码:
- 读文件前,先确认文件保存时用的编码(如记事本另存为时选的 UTF-8 / GBK)
- 网络响应(如 HTTP)需从响应头(
Content-Type: text/html; charset=UTF-8)提取编码 - 无法确定编码时,可借助第三方库(如 ICU4J、juniversalchardet)做编码探测,但不保证 100% 准确
不推荐的写法:手动 byte[] → String 转换
虽然可以用 new String(byteArray, "UTF-8") 短暂转换,但这只适用于已知完整字节数组的场景;对持续流式读取(尤其含多字节字符边界被截断时),直接构造字符串会出错。真正处理流,应始终走 InputStreamReader 这条标准路径。


















