System.setOut 可将 System.out 重定向至文件、内存缓冲区等任意 PrintStream;需构造新流并调用 setOut,注意线程安全、资源关闭及提前保存原始流以恢复。

System.setOut 可以把 System.out 重定向到任意的 PrintStream,比如文件、内存缓冲区或自定义输出目标。
重定向到文件
最常见需求是把控制台输出保存到文件。需要创建一个指向文件的 PrintStream,再用 System.setOut 替换原始输出流:
- 用
new PrintStream(new FileOutputStream("output.txt"))构造输出流 - 调用
System.setOut(printStream)生效 - 注意:之后所有
System.out.println()都写入该文件,不再显示在控制台 - 记得关闭流(尤其在程序结束前),避免资源泄漏
重定向到内存(如 StringBuilder)
适合测试或临时捕获输出内容:
- 创建
ByteArrayOutputStream+PrintStream - 调用
System.setOut(new PrintStream(byteArrayOutputStream)) - 执行打印操作后,用
byteArrayOutputStream.toString()获取内容 - 可随时恢复原输出流:
System.setOut(System.out)(需提前保存原始引用)
注意事项和常见陷阱
重定向不是线程安全的全局操作,会影响整个 JVM 的 System.out:
立即学习“Java免费学习笔记(深入)”;
- 多线程环境下要小心,一个线程修改会影响其他线程
- 重定向后,
System.out指向新流,但原流对象仍存在,可保留引用用于恢复 - 不要在重定向后继续使用已关闭的流,会抛
IOException - 某些 IDE 或容器(如 Tomcat)可能对标准输出有额外封装,行为可能略有差异
恢复原始输出流
重定向后若想还原,必须在调用 setOut 前保存原始 PrintStream:
PrintStream originalOut = System.out;- 执行重定向操作
- 需要时调用
System.setOut(originalOut) - 这是唯一可靠的方式,因为
System.out初始化后不可逆查


















