可以使用 System.setOut 将 System.out 重定向到文件,需基于 FileOutputStream 构建带 UTF-8 编码和自动刷新的 PrintStream,调用前保存原始输出流以便恢复,注意路径、线程安全及流生命周期管理。

可以使用 PrintStream.setOut 将 System.out 重定向到文件,但需注意:必须传入一个有效的、可写的 PrintStream 实例,且该流应基于文件输出流(FileOutputStream)构建。
创建指向文件的 PrintStream
先用 FileOutputStream 打开目标文件,再包装成 PrintStream。推荐指定字符编码(如 UTF-8),避免中文乱码:
- 使用
new FileOutputStream("output.txt", true)可追加写入(第二个参数为true) - 使用
new PrintStream(fileOutputStream, true, "UTF-8")启用自动刷新并设置编码
调用 System.setOut 替换标准输出
直接调用静态方法 System.setOut(...)(注意不是 PrintStream.setOut —— 该方法不存在;正确方法是 System.setOut):
-
System.setOut(printStream)是唯一标准方式 - 调用后所有
System.out.println(...)都会写入该文件 - 若需恢复控制台输出,保存原始
PrintStream(System.out)并在适当时机还原
完整示例代码
以下是一个安全、可运行的重定向示例:
立即学习“Java免费学习笔记(深入)”;
PrintStream originalOut = System.out;
try (PrintStream fileOut = new PrintStream(
new FileOutputStream("log.txt", true),
true,
"UTF-8")) {
System.setOut(fileOut);
System.out.println("这行会写入文件");
System.out.println("支持中文:你好世界");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 如需恢复,可在此还原(注意:fileOut 已关闭,不可再用)
System.setOut(originalOut);
}
注意事项与常见问题
重定向后容易忽略的关键点:
- 文件路径默认是相对路径(相对于 JVM 启动目录),建议用绝对路径或提前确认工作目录
- 重定向不影响
System.err,错误仍输出到控制台;如需统一日志,需单独调用System.setErr - 多线程环境下,
System.out是共享的,重定向会影响所有线程的println调用 - 不要在 finally 块中直接用已关闭的
PrintStream恢复,应保存原始引用
不复杂但容易忽略细节,关键是用对 System.setOut,配好带编码和自动刷新的 PrintStream,并妥善管理流生命周期。


















