阻止或重定向标准输出错误
有时,设计糟糕的第三方库会向 System.out
或 System.err
流写入不需要的诊断信息。建议的解决方案是找到更好的库或(在开源的情况下)修复问题并为开发人员提供补丁。
如果上述解决方案不可行,那么你应该考虑重定向流。
在命令行上重定向
在 UNIX,Linux 或 MacOSX 系统上可以使用 >
重定向从 shell 完成。例如:
$ java -jar app.jar arg1 arg2 > /dev/null 2>&1
$ java -jar app.jar arg1 arg2 > out.log 2> error.log
第一个将标准输出和标准错误重定向到“/ dev / null”,这会丢弃写入这些流的任何内容。第二个将标准输出重定向到“out.log”,将标准错误重定向到“error.log”。
(有关重定向的更多信息,请参阅你正在使用的命令 shell 的文档。类似的建议适用于 Windows。)
或者,你可以在启动 Java 应用程序的包装器脚本或批处理文件中实现重定向。
Java 应用程序中的重定向
也可以使用 System.setOut()
和 System.setErr()
在 Java 应用程序中重新编写流。例如,以下代码段将标准输出和标准错误重定向到 2 个日志文件:
System.setOut(new PrintStream(new FileOutputStream(new File("out.log"))));
System.setErr(new PrintStream(new FileOutputStream(new File("err.log"))));
如果要完全丢弃输出,可以创建一个写入到无效文件描述符的输出流。这在功能上等同于在 UNIX 上写入“/ dev / null”。
System.setOut(new PrintStream(new FileOutputStream(new FileDescriptor())));
System.setErr(new PrintStream(new FileOutputStream(new FileDescriptor())));
注意:小心如何使用 setOut
和 setErr
:
- 重定向将影响整个 JVM。
- 通过这样做,你将剥夺用户从命令行重定向流的能力。