阻止或重定向标准输出错误

有时,设计糟糕的第三方库会向 System.outSystem.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())));

注意:小心如何使用 setOutsetErr

  1. 重定向将影响整个 JVM。
  2. 通过这样做,你将剥夺用户从命令行重定向流的能力。