Java review--IO

ZeroWM發表於2016-08-01



為什麼出現IO流?

File是對檔案的增、刪、改、查、移動,但是File不可以對檔案的內容進行讀、取,而IO流就是為了解決這一問題的。


什麼是IO流呢?

Input Output,流的功能就是進行資料的輸入和輸出。根據流的方向分為輸入、輸出流;根據流輸出的資料格式分為位元組、字元流;根據是否經過處理分為節點、處理流。


IO流包括什麼?

IO流的核心4大基本流:InputStream、OutputStream、Reader、Writer。

通過裝飾這些核心流,擴充套件功能的流如下:


BufferedInputStream:----------------------------->針對快取
能為輸入流提供緩衝區,能提高很多IO的速度。你可以一次讀取一大塊的資料,而不需要每次從網路或者磁碟中一次讀取一個位元組。特別是在訪問大量磁碟資料時,緩衝通常會讓IO快上許多。
實現:
InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"), 8 * 1024);


DataInputStream:----------------------------->針對基本資料型別
可以使你從輸入流中讀取Java基本型別資料,而不必每次讀取位元組資料。你可以把InputStream包裝到DataInputStream中,然後就可以從此輸入流中讀取基本型別資料了。




ObjectInputStream:----------------------------->針對物件
ObjectInputStream能夠讓你從輸入流中讀取Java物件,而不需要每次讀取一個位元組。你可以把InputStream包裝到ObjectInputStream中,然後就可以從中讀取物件了。
讀的物件必須是Object的例項,必須事先通過ObjectInputStream序列化到“object.data”檔案。



位元組陣列和過濾器輸入輸出流:----------------------------->針對陣列
ByteArrayInputStream,ByteArrayOutputStream
位元組陣列傳給ByteArrayInputStream的建構函式,把ByteArrayInputStream賦值給InputStream就可以了。



IO流跟設計模式之間的關係?

裝飾者模式:

在不必改變原來類檔案和使用繼承的情況下,動態的擴充套件一個物件的功能。它通過建立一個包裝的物件,也就是裝飾,來包裹真正的物件。

InputStream就是裝飾模式中的超類(Component),FileInputStream ,ByteArrayInputStream等相當於被裝飾者。BufferedInputStream是被裝飾者的具體產物。


介面卡模式:

將一個類的介面,適配成使用者所期待的。一個介面卡允許通常因為介面不相容而不能在一起工作的類工作在一起,做法是將類自己的介面包裹在一個已存在類中。


InputStreamReader和InputStream最大的區別是:InputStream讀取的是位元組流,讀取的都是二進位制輸入輸出,速度快,不容易亂碼,但是它的Read()方法,因為讀取的是位元組,不易閱讀;InputStreamReader讀取的時候,將位元組轉換成字元流。

建構函式如下:

   public InputStreamReader(InputStream in, String charsetName) 
        throws UnsupportedEncodingException 
    { 
       super(in); 
       if (charsetName == null) 
       throw new NullPointerException("charsetName"); 
       sd = StreamDecoder.forInputStreamReader(in, this, charsetName); //轉碼的過程
    } 




參考部落格:

從裝飾者模式的理解說JAVA的IO包














相關文章