OutputStreamWriter是字符流通向字节流的桥梁,将字符按指定编码(如UTF-8)编码为字节写入底层OutputStream,解决字节流无法直接写字符、FileWriter无法显式指定编码的问题。

OutputStreamWriter 是 Java 中连接字节流与字符流的关键桥梁,它把字符流(以字符为单位)转换成字节流(以字节为单位),并支持指定字符编码。它本身不是直接读写文件的类,而是包装一个 OutputStream(如 FileOutputStream),让你能用字符方式写入文本内容,同时控制编码格式(比如 UTF-8、GBK)。
为什么需要 OutputStreamWriter?
Java 的 OutputStream(如 FileOutputStream) 只能写入字节,不能直接写字符串或 char;而 Writer 类(如 FileWriter) 虽然能写字符,但默认使用平台编码(可能乱码),且不便于显式指定编码。OutputStreamWriter 正好弥补这两点:
- 接受 OutputStream,复用底层字节输出能力(比如写文件、网络 socket)
- 提供 write(char[] / String / int) 等字符级方法
- 构造时可传入 Charset 或编码名(如 "UTF-8"),确保文本按预期编码写入
基本用法:写入文件(推荐带缓冲)
典型流程是:FileOutputStream → OutputStreamWriter → BufferedWriter(提升性能):
FileOutputStream fos = new FileOutputStream("note.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("你好,世界!");
bw.newLine();
bw.write("This is UTF-8 encoded.");
bw.close(); // 关闭 bw 会自动关闭 osw 和 fos
⚠️ 注意:不要只关 OutputStreamWriter —— 它不会自动刷新缓冲区,也不保证 flush() 被调用。用 BufferedWriter 包一层更安全,它的 close() 会先 flush 再关闭下层流。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
常见编码问题与处理
乱码往往源于编码不一致。使用 OutputStreamWriter 时务必确认三处编码统一:
- 创建 OutputStreamWriter 时指定的编码(如 "UTF-8")
- 目标文件被其他程序(如记事本、IDE)打开时使用的编码
- 若写入网络或数据库,对方解析时采用的编码也需匹配
示例:写 GBK 编码文件(兼容中文旧系统):
try (OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("gbk.txt"), "GBK")) {
osw.write("测试GBK编码");
}
与 FileWriter 的区别
FileWriter 是 OutputStreamWriter 的子类封装,等价于:new OutputStreamWriter(new FileOutputStream(file))
但它不接受编码参数(JDK 11 前只能用平台默认编码),所以:
- 要明确控制编码 → 选 OutputStreamWriter
- 只是简单写本地文件且接受默认编码 → FileWriter 更简洁
- 生产环境建议一律用 OutputStreamWriter + 显式编码,避免隐式依赖系统设置
不复杂但容易忽略:每次写完记得 close 或 try-with-resources,否则内容可能滞留在缓冲区未写出。

















