java I/O———System類對IO的支持

學習完PrintStream與PrintWriter後,我們發現裏面的方法名都很熟悉。例如:print()、println(),實際上我們一直在使用的系統輸出就是利用了IO流的模式完成。在System類中定義了三個操作的常量。

  1. 標準輸出(顯示器) : public final static PrintStream out
  2. 錯誤輸出 : public final static PrintStream err
  3. 標準輸入(鍵盤):public final static InputStream in

一直在使用的System.out.println()屬於IO的操作範疇

1.系統輸出

系統輸出一共有兩個常量:out、err,並且這兩個常量表示的都是PrintStream類的對象。

  1. out輸出的是希望用戶能看到的內容
  2. 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中進行中文的處理,最好的做法是將所有輸入的數據保存在一起再處理,這樣纔可以保證不出現亂碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章