OutputStreamWriter 是 Java 中连接字符流与字节流的桥梁,需显式指定编码(推荐 StandardCharsets.UTF_8),配合 try-with-resources 确保资源释放;可包装 BufferedWriter 提升写入性能并支持跨平台换行。

OutputStreamWriter 是 Java 中连接字符流与字节流的桥梁,它把字符(按指定编码)转换成字节,再交给底层 OutputStream(比如 FileOutputStream)写入文件。
关键:必须显式指定字符编码
如果不指定编码,OutputStreamWriter 会使用平台默认编码(如 Windows 上是 GBK,Linux/macOS 上通常是 UTF-8),极易导致跨平台乱码。务必用 Charset 或编码名称明确指定。
- 推荐用
StandardCharsets.UTF_8(Java 7+),类型安全、无异常 - 也可传字符串名,如
"GBK"、"ISO-8859-1",但需捕获UnsupportedEncodingException
基本写入流程(带资源自动管理)
推荐使用 try-with-resources,确保流正确关闭,避免资源泄漏:
try (FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
osw.write("你好,世界!"); // 写入字符串
osw.write('\n');
osw.write("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
}
这里 osw 将“你好,世界!”按 UTF-8 编码转为字节(如 E4 BD A0 E5 A5 BD),再由 fos 写入磁盘文件。
立即学习“Java免费学习笔记(深入)”;
常见编码选择与注意事项
- UTF-8:通用首选,兼容中文、英文及几乎所有语言,推荐用于新项目
- GBK/GB2312:仅限处理老旧中文系统或特定要求场景,不支持 emoji 和部分生僻字
- ISO-8859-1:单字节编码,只能表示 ASCII 扩展字符,慎用于含中文的场景
- 写入后用文本编辑器打开时,需确保编辑器也用相同编码打开,否则仍显示乱码
进阶:包装成 BufferedWriter 提升性能
频繁小量写入时,直接用 OutputStreamWriter 效率低。可套一层 BufferedWriter 缓冲输出:
try (FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw)) {
bw.write("第一行");
bw.newLine(); // 跨平台换行
bw.write("第二行");
} catch (IOException e) {
e.printStackTrace();
}
BufferedWriter 会批量写入,减少系统调用次数,同时提供 newLine() 方法适配不同系统的换行符(\r\n 或 \n)。


















