System.out.println與System.err.println的區別
來源:互聯網
上載者:User
同時使用了System.out.println與System.err.println()列印輸入內容,結果看到的內容和預想的不一樣,順序與預料的不同並不是因為err和out的區別導致,而是因為他們是兩個流,由於緩衝原因導致輸出順序不同。
1、System.out.println 能重新導向到別的輸出資料流,這樣的話你在螢幕上將看不到列印的東西了, 而System.err.println只能在螢幕上實現列印,即使你重新導向了也一樣。
System.setOut(new PrintStream(new FileOutputStream(new File("c:/test.txt "))));
System.out.println( "haha ");
2、
當向控制台輸出資訊時,開發人員有兩個選擇:System.out和System.err。使用者更傾向於輸出的是System.out,而如果是System.err則輸出“error”。儘管這看起來是顯而易見的,但很多開發人員都不瞭解為什麼出錯和調試時使用System.err。(如果 你使用err列印出的字串,在eclipse的console會顯示成紅色的哦。) 當輸出一個流時,JVM和作業系統共同決定何時輸出這個流。也就是說,儘管開發人員鍵入了:
System.out.print_
("Test Output:");
JVM和作業系統的組合體並不會立即輸出這個流。相反,它將保持等待狀態直到將要輸出的東西達到一定的量。
假設輸入以下指令:
System.out.println("Debugging Info.");
JVM可能同意輸出;然而,作業系統可能決定暫不輸出。
由於這個原因,在偵錯工具時想要發現出錯的位置就有可能成為問題。考慮以下的程式:
for(int i=0; i<56; i++) {
System.out.println(i);
... // containing an error
}
錯誤可能出現在i等於54時,但是可能JVM在i等於49時就結束輸出了。50到54仍然存在於緩衝中,結果也就丟失了。
使用System.err來報告錯誤、偵錯工具就可以避免這種情況出現,它將使每一次操作的結果都輸出出來。例如以下程式:
for(int i=0; i<56; i++) {
System.err.println(i);
... // containing an error
}
在每一次i等於54時都將顯示錯誤資訊。
3、System.out.println可能會被緩衝,而System.err.println不會
4、System.err和System.out 就是錯誤輸出和標準輸出
如果你用LOG4J記錄日誌的話,且設定錯誤等級的話
System.err的輸出是將記錄到日誌中
5、輸出裝置是一樣的 所以你看到的是一樣的
System.setErr() System.setOut() 是重新導向兩個流的方法。
以下為Sun JDK1.5中文文檔中的 可能有點泛泛了
------------------------------
System.err
“標準”錯誤輸出資料流。此流已開啟並準備接受輸出資料。
通常,此流對應於顯示器輸出或者由主機環境或使用者指定的另一個輸出目標。按照慣例,此輸出資料流用於顯示錯誤訊息,或者顯示那些即使使用者輸出資料流(變數 out 的值)已經重新導向到通常不被連續監視的某一檔案或其他目標,也應該立刻引起使用者注意的其他資訊。
System.out “標準”輸出資料流。此流已開啟並準備接受輸出資料。通常,此流對應於顯示器輸出或者由主機環境或使用者指定的另一個輸出目標。
6、System.err.println()是要緩衝的,所以優先順序會高點,而System.out.println()是不需要緩衝的,所以優先順序會低點.