Java中需逐层包装System.out:OutputStreamWriter转字符流(推荐UTF-8),再用BufferedWriter加缓冲;write()后必须flush(),避免close()以防System.out失效。

Java 中 BufferedWriter 不能直接“写入” OutputStreamWriter 转换后的 System.out,而是要以 System.out 为源头,**逐层包装**:先用 OutputStreamWriter 将字节流(System.out)转为字符流,再用 BufferedWriter 加上缓冲能力。最终通过 BufferedWriter 的 write() 和 flush() 方法输出内容。
正确构建链式包装流
标准输出 System.out 是 PrintStream(继承自 OutputStream),需先转成字符流,再加缓冲:
-
System.out→OutputStreamWriter(指定编码,推荐"UTF-8") -
OutputStreamWriter→BufferedWriter(可选缓冲区大小,默认 8192 字符)
示例代码:
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(System.out, StandardCharsets.UTF_8)
);
写入与刷新必须配合使用
BufferedWriter 默认缓冲输出,不调用 flush() 或 close(),内容可能滞留在缓冲区中不显示:
立即学习“Java免费学习笔记(深入)”;
- 用
writer.write("Hello")写入字符串(不换行) - 用
writer.newLine()换行(比write("\n")更跨平台) - 务必调用
writer.flush()强制输出到控制台 - 程序结束前建议
writer.close()(会自动 flush,但关闭后不可再用)
注意 System.out 的线程安全性与关闭风险
System.out 是全局共享资源,多线程写入时需自行同步;更重要的是:不要 close BufferedWriter 包装的 System.out —— 因为 BufferedWriter.close() 会递归关闭底层 OutputStreamWriter,进而关闭 System.out,导致后续所有 System.out.println() 失效。
- 如只需临时增强输出性能,用完
flush()即可,避免close() - 若必须关闭,确认这是程序末尾且不再需要标准输出
替代方案:更简洁的写法(Java 8+)
如果只是想提升 System.out 的字符写入效率,且不需要复杂格式化,可直接使用:
PrintWriter pw = new PrintWriter(
new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true
);
其中第二个参数 true 表示自动 flush(每次 println() 后自动刷出),更接近传统 System.out.println() 的行为,同时支持 UTF-8 编码。


















