Java面向對象系列[v1.0.0][IO流概念體系]

Java的IO流失實現輸入/輸出的基礎,他可以方便的實現數舉得輸入/輸出操作,在Java中把不同的輸入/輸出源抽象表示爲“stream”,通過stream的方式允許Java程序使用相同的方式來訪問不同的輸入/輸出源,Stream是從源到接收的有序數據,Java把所有傳統的流類型都放在了java.io包中,用來實現輸入和輸出功能

流的分類

輸入和輸出流

  • 輸入流:只能從中讀取數據,而不能向其寫入數據
  • 輸出流:只能向其寫入數據,而不能從中讀取數據

這裏說的輸入和輸出是從程序運行所在內存的角度來說的,比如數據從內存到硬盤,成爲輸出流,在CS結構的程序中,數據從服務器通過網絡流向客戶端,Server端的內存負責將數據輸出到網絡裏,因此Server端的程序使用輸出流,Client端的內存負責從網絡裏讀取數據,因此Client端的程序應該使用輸入流
Java的輸入流主要由InputStream和Reader作爲基類,而輸出流則主要由OutputStream和Writer作爲基類,他們都是抽象基類,無法直接創建實例

字節流和字符流

字節流和字符流的用法幾乎完全一樣,區別在於字節流和字符流所操作的數據單元不同,字節流操作的數據單元是8位的字節,而字符流操作的數據單元是16位的字符
字節流主要由InputStream和OutputStream作爲基類,而字符流則主要由Reader和Writer作爲基類

節點流和處理流

如果按照流的角色來區分,可以分爲節點流和處理流
從/向一個特定的IO設備例如磁盤、網絡等讀/寫數據的流,稱爲節點流,節點流也被稱爲低級流,當使用節點流進行輸入/輸出時,程序直接鏈接到實際的數據源,和實際的輸入/輸出節點連接
處理流則是用於對一個已經存在的流進行連接或封裝,通過封裝後的流來實現數據讀/寫功能,處理流也被稱爲高級流,當時用處理流進行輸入/輸出時,程序並不會直接連接到實際的數據源,沒有和實際的輸入/輸出節點連接
使用處理流的優勢在於只要使用相同的處理流,就可以採用完全相同的輸入/輸出代碼來訪問不同的數據源,隨着處理流所包裝節點流的變化,程序實際所訪問的數據源也相應的發生變化
使用處理流來包裝節點流是一種典型的裝飾器設計模式,通過使用處理流來包裝不同的節點流可以消除不同節點流的實現差異,也可以提供更方便的方法來完成輸入輸出功能,因此處理流也被稱爲包裝流

流的概念模型

Java把所有設備裏的有序數據抽象成流模型,簡化了輸入和輸出的處理,Java的IO流共涉及40多個類,這40多個類都是從如下4個抽象類派生的

  • InputStream/Reader:所有輸入流的基類,前者是字節輸入流,後者是字符輸入流
  • OutputStream/Writer:所有輸出流的基類,前者是字節輸出流,後者是字符輸出流
    • 字節和字符就是流中的最小輸入/輸出單位
    • 輸入流和輸出流都使用隱式的記錄指針的方式來表示當前正準備從哪個字節或者字符開始讀取,每當程序從流利讀取一個或多個字節/字符後,記錄指針自動後移,並且提供了一些方法來控制記錄指針的移動

除此之外,Java的處理流通過增加緩衝的方式來提高了輸出輸出的效率,並且提供了一系列便捷的方法來一次性輸入/輸出大量的內容,而不僅僅是字節或字符;處理流可以加在任何已經存在的流的基礎之上,這樣應用程序就可以採用相同的代碼和透明的方式來訪問不同的輸入/輸出設備的數據流,因此程序就無需關心輸入/輸出節點是磁盤、網絡還是其他的輸入/輸出設備,程序只需要將這些節點流包裝成處理流,便可以使用相同的輸入/輸出代碼來讀寫不同的輸入/輸出設備的數據

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