阻止或重定向標準輸出錯誤

有時,設計糟糕的第三方庫會向 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. 通過這樣做,你將剝奪使用者從命令列重定向流的能力。