首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深度解析 Java System.out 與 System.err 區別及最佳實踐

     編輯:Java 相關知識

核心區別一覽

特性System.outSystem.err
用途標準輸出流,業務日誌、結果輸出標準錯誤流,異常堆棧、關鍵告警
緩衝機制默認帶緩衝默認無緩衝(即時刷新)
Eclipse 顏色藍色紅色
Log4j 捕獲默認不捕獲默認捕獲至日誌文件

緩衝差異導致的輸出亂序問題

經典測試代碼揭示隱患:

public class Test2 {
    static { System.out.println("1"); }
    public static void main(String[] args) {
        System.err.println("2"); // 無緩衝,立即輸出
        new Test2();             // 觸發靜態塊 -> "1"
    }
    public Test2() { System.out.println("3"); } // 有緩衝,延遲輸出
}

輸出結果:2 可能出現在 1 和 3 之間(隨機),因為 err 繞過緩衝直接落盤/顯示,而 out 積累緩衝區才刷新。

⚠️ 生產代碼中嚴禁混用 out/err 進行同步邏輯輸出,應統一使用日誌框架(SLF4J+Logback)。

重定向與管道場景

  • java App > out.log 2> err.log:分離業務輸出與錯誤診斷
  • Docker/K8s 日誌收集器通常分別掛載 stdout/stderr 路徑

最佳實踐建議

  1. 業務流程輸出 → logger.info()
  2. 異常堆棧、關鍵故障 → logger.error()(內部走 err)
  3. 單元測試/臨時調試 → 可用 System.out,但提交前需清理
  4. 若必須直接用流,請手動 flush() 確保順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved