Java中字符流转字节流需通过编码转换,推荐用OutputStreamWriter包装字节流并指定编码(如UTF-8),或用String.getBytes(Charset)手动转byte[];务必显式指定编码以避免乱码。

Java 中字符流转换为字节流,核心是通过 编码转换 实现——字符流处理的是带编码的文本(如 UTF-8、GBK),字节流处理的是原始字节。二者不能直接强转,必须借助 OutputStreamWriter(字符→字节的桥梁)或手动编码(如 String.getBytes())。
用 OutputStreamWriter 包装字节输出流
这是最标准、推荐的方式,适用于需要持续写入文本内容的场景(比如把字符串逐行写入文件):
- 创建一个 OutputStream(如 FileOutputStream)作为底层字节出口
- 用 OutputStreamWriter 包装它,并指定字符编码(如 "UTF-8")
- 调用 write() 写入字符串,内部自动按指定编码转成字节,再写入底层流
示例:
FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
osw.write("你好,世界!"); // 自动编码为 UTF-8 字节并写入
osw.close();
用 String.getBytes() 手动转字节数组
适合一次性转换少量字符串,不涉及流操作,结果是 byte[],可后续传给字节流:
立即学习“Java免费学习笔记(深入)”;
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 调用 String.getBytes(Charset) 或 String.getBytes(String charsetName)
- 返回的 byte[] 就是该字符串按指定编码生成的原始字节
- 可直接写入 FileOutputStream、ByteArrayOutputStream 等字节流
示例:
String str = "Hello 你好";
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
FileOutputStream fos = new FileOutputStream("data.bin");
fos.write(bytes); // 写入字节流
fos.close();
注意编码一致性
字符流 ↔ 字节流转换的关键不是“怎么转”,而是“按什么规则转”。常见问题都源于编码不匹配:
- 写入时用 UTF-8 编码,读取时却用 GBK 解码 → 出现乱码
- 未显式指定编码,依赖平台默认(Windows 常为 GBK,Linux/macOS 常为 UTF-8)→ 跨环境出错
- 使用无参 getBytes() 或无参 OutputStreamWriter() → 隐式使用系统默认编码,不安全
务必显式传入 Charset 或编码名,例如 StandardCharsets.UTF_8 或 "UTF-8"。
反向转换:字节流 → 字符流用 InputStreamReader
虽然问题问的是字符→字节,但实际开发中常需双向转换。对应地,把字节流转为字符流应使用 InputStreamReader:
- 包装 FileInputStream 等字节输入流
- 指定与写入时一致的编码,才能正确还原字符
示例:
FileInputStream fis = new FileInputStream("out.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
int c;
while ((c = isr.read()) != -1) {
System.out.print((char) c);
}

















