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