學習完PrintStream與PrintWriter後,我們發現裏面的方法名都很熟悉。例如:print()、println(),實際上我們一直在使用的系統輸出就是利用了IO流的模式完成。在System類中定義了三個操作的常量。
- 標準輸出(顯示器) : public final static PrintStream out
- 錯誤輸出 : public final static PrintStream err
- 標準輸入(鍵盤):public final static InputStream in
一直在使用的System.out.println()屬於IO的操作範疇
1.系統輸出
系統輸出一共有兩個常量:out、err,並且這兩個常量表示的都是PrintStream類的對象。
- out輸出的是希望用戶能看到的內容
- err輸出的是不希望用戶看到的內容
這兩種輸出在實際的開發之中都沒用了,取而代之的是"日誌"。
System.err只是作爲一個保留的屬性而存在,現在幾乎用不到。唯一可能用到的就是System.out。
由於System.out是PrintStream的實例化對象,而PrintStream又是OutputStream的子類,所以可以直接使用System.out直接爲OutputStream實例化,這個時候的OutputStream輸出的位置將變爲屏幕。
範例:使用System.out爲OutputStream實例化。
public class TestPrint {
public static void main(String[] args) throws Exception {
OutputStream out = System.out ;
out.write("我是飛飛魚".getBytes());
}
}
抽象類不同的子類針對於同一方法有不同的實現,而用戶調用的時候核心參考的是抽象類。
2.系統輸入
System.in對應的類型是InputStream,而這種輸入流指的是由用戶通過鍵盤進行輸入(用戶輸入)。java本身並沒有直接的用戶輸入處理,如果要想實現這種操作,必須使用java.io的模式來完成。
範例:利用InputStream實現數據輸入
現在發現當用戶輸入數據的時候程序需要暫停執行,也就是程序進入了阻塞狀態。直到用戶輸入完成(按下回車),程序才能繼續向下執行。
以上的程序本身有一個致命的問題,核心點在於:開闢的字節數組長度固定,如果現在輸入的長度超過了字節數組長度,那麼只能夠接收部分數據。這個時候是由於一次讀取不完所造成的問題,所以此時最好的做法是引入內存操作流來進行控制,這些數據先保存在內存流中而後一次取出。
範例:引入內存流。
現在雖然實現了鍵盤輸入數據的功能,但是整體的實現邏輯過於混亂了,即java提供的System.in並不好用,還要結合內存流來完成,複雜度很高。
如果要想在IO中進行中文的處理,最好的做法是將所有輸入的數據保存在一起再處理,這樣纔可以保證不出現亂碼。