第15章-输入/输出 --- 理解Java的IO流
(一)理解Java的IO流
JAVA的IO流是實現輸入/輸出的基礎,它可以方便地實現數據的輸入/輸出操作,在Java中把不同的輸入/輸出(鍵盤、文件、網絡連接等)抽象表述為"流"(Stream),通過流的方式允許Java程序使用相同的方式來訪問不同的輸入/輸出源。
Stream是從起源(source)到接收(sink)的有序數據
?
(二)流的分類
1.輸入流和輸出流
按照流的流向來分,可以分為輸入流和輸出流:
a. ?輸入流:只能從中讀取數據,而不能向其寫入數據。
b. ?輸出流:只能向其寫入數據,而不能從中讀取數據。
?
此處的輸入、輸出涉及一個方向問題,如下圖所示的數據流向:數據從內存到硬盤,通常稱為輸出流--也就是說,這里的輸入、輸出都是從程序運行所在內存的角度來劃分的。
對于下面所示的數據流向,數據從服務器通過網絡流向客戶端,在這種情況下,Server端的內存負責將數據輸出到網絡里,因此Server端的程序使用輸出流;Client端的內存負責從網絡里讀取數據,因此Client端的程序應該使用輸入流。
?
2.字節流和字符流
字節流和字符流的用法幾乎完全一樣,區別在于字節流和字符流所操作的數據單元不同--字節流操作的數據單元是8位字節,而字符流操作的數據單元是16位的字符
?
字節流主要有InputStream和OutputStream作為基類,而字符流則組要由Reader和Writer作為基類。
?
3.節點流和處理流
按照流的角色來分,可以分為節點流和處理流:
可以從/從一個特定的IO設備(如磁盤、網絡)讀/寫數據的流,稱為節點流,節點流也被稱為低級流(Low Level Stream)。
下圖顯示了節點流示意圖:
從上圖可以看出,當使用節點流進行輸入/輸出時,程序直接連接到實際的數據源,和時間的輸入/輸出節點連接。
?
處理流則用于對一個已存在的流進行連接或封裝,通過封裝后的流來實現數據讀/寫功能,處理流也被稱為高級流。
下圖顯示了處理流示意圖:
從上圖可以看出,當使用處理流進行輸入/輸出時,程序并不會直接連接到實際的數據源,沒有和實際的輸入/輸出節點連接。使用處理流的一個明顯好處是,只要使用相同的處理流,程序就可以采用完全相同的輸入/輸出代碼來訪問不同的數據源,隨著處理流所包裝節點流的變化,程序實際所訪問的數據源也相應的發生變化。
?
(三)流的概念模型
Java的IO流共涉及40多個類,這些類看上去很凌亂,但實際上非常規則,而且彼此之間存在非常緊密的聯系。Java的IO流的40多個類都是從如下4個抽象類派生的:
(1)InputStream/Reader:所有輸入流的基類,前者是字節輸入流,后者是字符輸入流。
(2)OutputStream/Writer:所有輸出流的基類,前者是字節輸出流,后者是字符輸出流。
?
對于InputStream和Reader而言,它們把輸入設備抽象成一個"水管",這個水管里的每一個"水滴"一次排序:
如下圖:
從上圖可以看出,字節流和字符流的處理方式其實非常相似,只是它們處理的輸入/輸出單位不同而已。輸入流使用隱式的記錄指針來表示當前正準備從哪個"水滴"開始讀取,每當程序從InputStream或Reader里取出一個或多個"水滴"后,記錄指針自動向后移動;除此之外,InputStream和Reader里都提供了一些方法來控制記錄指針的移動。
?
?
對于OutputStream和Writer而言,它們同樣把輸出設備抽象成一個"水管",只是這個水管里沒有任何水滴,如下圖:
?
如上圖,當執行輸出時,程序相當于依次把"水滴"放入到輸出流的水管中,輸出流同樣采用隱式的記錄指針來標識當前水滴即將放入的位置,每當程序向OutputStream或Writer里輸出一個或多個水滴后,記錄指針自動向后移動。
?
上面兩幅圖顯示了Java IO流的基本概念模型,除此之外,Java的處理流模型則體現了Java輸入/輸出流設計的靈活性。
處理流的功能主要體現在以下兩個方面:
(1)性能的提高:主要以增加緩沖的方式來提供輸入/輸出的效率。
(2)操作的便捷:處理流可能提供了一系列便捷的方法來一次輸入/輸出大批量的內容,而不是輸入/輸出一個或多個“水滴”。
轉載于:https://www.cnblogs.com/baiduligang/p/4247454.html
總結
以上是生活随笔為你收集整理的第15章-输入/输出 --- 理解Java的IO流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Advanced Installer 制
- 下一篇: OpenCV2学习笔记(一)