system.in, system.out, system.err這3個流同樣是常見的資料來源和資料流目的地。使用最多的可能是在控制台程式裡利用system.out将輸出列印到控制台上。
jvm啟動的時候通過java運作時初始化這3個流,是以你不需要初始化它們(盡管你可以在運作時替換掉它們)。
system.in是一個典型的連接配接控制台程式和鍵盤輸入的inputstream流。通常當資料通過指令行參數或者配置檔案傳遞給指令行java程式的時候,system.in并不是很常用。圖形界面程式通過界面傳遞參數給程式,這是一塊單獨的java io輸入機制。
system.out是一個printstream流。system.out一般會把你寫到其中的資料輸出到控制台上。system.out通常僅用在類似指令行工具的控制台程式上。system.out也經常用于列印程式的調試資訊(盡管它可能并不是擷取程式調試資訊的最佳方式)。
system.err是一個printstream流。system.err與system.out的運作方式類似,但它更多的是用于列印錯誤文本。一些類似eclipse的程式,為了讓錯誤資訊更加顯眼,會将錯誤資訊以紅色文本的形式通過system.err輸出到控制台上。
這是一個system.out和system.err結合使用的簡單示例:
盡管system.in, system.out, system.err這3個流是java.lang.system類中的靜态成員(譯者注:這3個變量均為final static常量),并且已經預先在jvm啟動的時候初始化完成,你依然可以更改它們。隻需要把一個新的inputstream設定給system.in或者一個新的outputstream設定給system.out或者system.err,之後的資料都将會在新的流中進行讀取、寫入。
可以使用system.setin(), system.setout(), system.seterr()方法設定新的系統流(譯者注:這三個方法均為靜态方法,内部調用了本地native方法重新設定系統流)。例子如下:
現在所有的system.out都将重定向到”c:\\data\\system.out.txt”檔案中。請記住,務必在jvm關閉之前沖刷system.out(譯者注:調用flush()),確定system.out把資料輸出到了檔案中。