一、System.out.println 能重定向到別的輸出流,這樣的話你在屏幕上將看不到打印的東西了,
而System.err.println只能在屏幕上實現打印,即便你重定向了也同樣。
System.setOut(new PrintStream(new FileOutputStream(new File( "c:/test.txt "))));
System.out.println( "haha ");
二、
當向控制檯輸出信息時,開發者有兩個選擇:System.out和System.err。使用者更傾向於輸出的是System.out,而若是是 System.err則輸出「error」。儘管這看起來是顯而易見的,但不少開發者都不瞭解爲何出錯和調試時使用System.err。
當輸出一個流時,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時都將顯示錯誤信息。
三、System.out.println可能會被緩衝,而System.err.println不會
四、System.err和System.out 就是錯誤輸出和標準輸出
若是你用LOG4J記錄日誌的話,且設定錯誤等級的話
System.err的輸出是將記錄到日誌中
五、輸出設備是同樣的 因此你看到的是同樣的
System.setErr() System.setOut() 是重定向兩個流的方法。
如下爲Sun JDK1.5中文文檔中的 可能有點泛泛了
------------------------------
System.err
「標準」錯誤輸出流。此流已打開並準備接受輸出數據。
一般,此流對應於顯示器輸出或者由主機環境或用戶指定的另外一個輸出目標。按照慣例,此輸出流用於顯示錯誤消息,或者顯示那些即便用戶輸出流(變量 out 的值)已經重定向到一般不被連續監視的某一文件或其餘目標,也應該馬上引發用戶注意的其餘信息。
System.out
「標準」輸出流。此流已打開並準備接受輸出數據。一般,此流對應於顯示器輸出或者由主機環境或用戶指定的另外一個輸出目標。
六、System.err.println()是要緩衝的,因此優先級會高點,而System.out.println()是不須要緩衝的,因此優先級會低點.