Java中可通过System.setOut()/setErr()配合PrintStream重定向控制台输出到文件,需注意影响全局、目录权限、显式关闭流;支持同时重定向或临时切换并恢复;生产环境推荐使用Log4j等日志框架替代。

Java 中可以通过多种方式将控制台输出(System.out 和 System.err)重定向到文件,最常用且简单的是使用 System.setOut() 和 System.setErr() 配合 PrintStream。
用 PrintStream 重定向 System.out 到文件
创建一个指向文件的 PrintStream,然后用 System.setOut() 替换默认输出流。注意:该操作会影响整个 JVM 的标准输出行为,后续所有 System.out.println() 都会写入文件。
- 确保目标目录可写,否则会抛出
FileNotFoundException - 建议在程序退出前关闭流(虽然 JVM 退出时通常自动释放,但显式关闭更稳妥)
- 示例代码:
PrintStream out = new PrintStream(new FileOutputStream("output.log"));
System.setOut(out);
System.out.println("这行会写入 output.log");
out.close(); // 推荐关闭
同时重定向 System.out 和 System.err
如果希望标准输出和错误都写入文件(或不同文件),可以分别设置:
- 用两个独立的
PrintStream实例,避免互相干扰 - 常见做法是让
err写入同一文件(追加模式)或单独的error.log - 示例:
PrintStream out = new PrintStream(new FileOutputStream("app.log"));
PrintStream err = new PrintStream(new FileOutputStream("app.log", true)); // 追加写入
System.setOut(out);
System.setErr(err);
临时重定向 + 恢复原始输出
有时只想在某段逻辑中重定向,之后恢复控制台输出。需要先保存原始流:
- 调用
System.out或System.err获取原始流引用 - 重定向执行完后,再调用
setOut()/setErr()设回原流 - 注意:原始流通常是
ConsoleOutputStream或FileOutputStream,但无需关心具体类型,直接保存引用即可
PrintStream originalOut = System.out;
PrintStream originalErr = System.err;
PrintStream fileOut = new PrintStream(new FileOutputStream("log.txt"));
System.setOut(fileOut);
System.setErr(fileOut);
// 执行需要重定向的操作
System.out.println("写入文件");
System.err.println("错误也写入文件");
// 恢复控制台输出
System.setOut(originalOut);
System.setErr(originalErr);
fileOut.close();
更灵活的方式:不修改 System.out,而是封装日志工具
生产环境不推荐直接篡改 System.out,容易引发不可预期行为(如其他库依赖控制台输出)。推荐替代方案:
- 使用成熟日志框架(Log4j、SLF4J + Logback),配置文件 Appender 即可实现输出到文件
- 自己封装一个简单的
Logger类,内部用FileWriter或BufferedWriter写文件 - 若只是调试,也可用 IDE 的运行配置重定向(如 IntelliJ 的 Run Configuration → Redirect input/output)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











