IO的框架

在Java IO中我們會經常提到輸入流和輸出流,流是一種抽象的數據總稱,本質是能夠進行數據的傳輸。按照流的方向分爲:輸入流和輸出流。按照流中處理數據的單位,可以將其區分爲:字節流和字符流。在Java中,字節就是1個Byte,8位,而字符是佔2個Byte,16位,字節是有符號類型,字符是無符號類型的。
接下來分別討論輸入流、輸出流、字節流和字符流。

一、以字節爲單位的輸入流的框架圖:

從上圖我們可以看出以字節爲單位的輸入流的公共父類是InputStream:
(1)InputStream是以字節爲單位的輸入流的超類,InputStream提供了接口從輸入流中讀取字節數據。
(2)ByteArrayInputStream是字節數組輸入流,它的內部緩衝區是一個字節數組,本質是通過字節數組來是實現的。
(3)PipedInputStream是管道輸入流,能夠實現多線程間的管道通信。
(4)FilterInputStream是過濾輸入流,它是DataInputStream和BufferedInputStream的超類。
(5)DataInputStream是數據輸入流,用來裝飾其他輸入流,允許應用程序以與機器無關方式從底層輸入流中讀取基本Java數據類型。
(6)BufferedInputStream是緩衝輸入流,作用是爲另一個輸入流添加緩衝功能。
(7)FileInputStream是文件輸入流,通常用於對文件進行讀取操作。
(8)File是文件和目錄路徑名的抽象表示形式,File不僅僅表示文件,也可以表示目錄,它的超類是Object。
(9)FileDescriptor是文件描述符,用來表示開放文件,開放套接字等。
(10)ObjectInputStream是對象輸入流,和ObjectOutputStream一起來對基本數據或對象進行持久存儲。

二、以字節爲單位的輸出流的框架圖:

從中我們可以看出,以字節爲單位的輸出流的公共父類是OutputStream:
(1)OutputStream是以字節爲單位的輸出流的超類,提供了write()函數從輸出流中讀取字節數據。
(2)ByteArrayOutputStream是字節數組輸出流,寫入ByteArrayOutputStream的數據被寫入到一個byte數組,緩衝區會隨着數據的不斷寫入而自動增長,可使用toByteArray()和toString()獲取數據。
(3)PipedOutputStream是管道輸出流,和PipedInputStream一起使用,能實現多線程間的管道通信。
(4)FilterOutputStream是過濾輸出流,是DataOutputStream,BufferedOutputStream和PrintStream的超類
(5)DataOutputStream是數據輸出流,用來裝飾其他的輸出流,允許應用程序以與機器無關方式向底層寫入基本Java數據類型。
(6)BufferedOutputStream是緩衝輸出流,它的作用是爲另一個輸出流添加緩衝功能。
(7)PrintStream是打印輸出流,用來裝飾其他輸出流,爲其他輸出流添加功能,方便的打印各種數據值
(8)FileOutputStream是文件輸出流,通常用於向文件進行寫入操作。
(9)ObjectOutputStream是對象輸出流,它和ObjectInputStream一起對基本數據或者對象的持久存儲。

三、以字節爲單位的輸入流和輸出流關聯的框架圖
輸入流和輸出流都有對應的關係,如圖:


四、以字符爲單位的輸入流的框架圖:



從圖我們可以看出,以字符爲單位的輸入流的公共類是Reader。
(1)Reader是以字符爲單位的輸入流的超類,它提供了read()接口來取字符數據。
(2)CharArrayReader 是字符數組輸入流,用於讀取字符數組,繼承於Reader。操作的數據是以字符爲單位。
(3)PipedReader 是字符類型的管道輸入流,它和PipedWriter一起可以通過管道進行進程間的通訊,在使用管道通信時,必須將PipedWriter和PipedReader配套使用。
(4)FilterReader是字符類型的過濾輸入流。
(5)BufferedReader是字符緩衝輸入流,作用是爲另一個輸入流添加緩衝功能。
(6)InputStreamReader是字節轉字符的輸入流,它是字節流通向字符流的橋樑。
(7)FileReader是字符類型的文件輸入流,通常用於對文件進行讀取操作。

五、以字符爲單位的輸出流的框架圖:

從圖中可以看出,Writer是所有字符輸出流的超類。
(1)Writer是以字符爲單位的輸出流的超類,它提供了writer()函數,進行對字符的寫。
(2)CharArrayWriter是字符數組輸出流,用於讀取字符數組,繼承於Writer,操作數據的單位是字符。
(3)PipedWriter是字符類型的管道輸出流,它和PipedReader一起是可以通過管道進行線程間的通訊,在使用管道通信時,必須將PipedReader和PipedWriter配套使用。
(4)FilterWriter是字符類型的過濾輸出流。
(5)BufferedWriter是字符緩衝輸出流,作用是爲另一個輸出流添加緩衝功能。
(6)OutStreamWriter是字節轉字符的輸出流,是字節通向字符流的橋樑。
(7)FileWriter 是字符類型的文件輸出流。
(8)File,獲取文件或者目錄對象
(9)PrintWriter是字符類型的打印輸出,用來裝飾其他輸出流,能爲其他的輸出流添加功能。

六、以字符爲單位的輸入流和輸出流關聯的框架圖:



七、字節轉換爲字符流的框架圖
在java中,字節流能轉換爲字符流,轉換關係圖

從上圖可以看出:
(1)FileReader繼承於InputStreamReader,而InputStreamReader依賴於InputStream,因爲InputStreamReader的構造函數是以InputStream爲參數,傳人InputStream會在InputStreamReader內部通過轉碼,將字節轉換成字符。
(2)FileWriter繼承於OutputStreamWriter,而OutStreamWriter依賴於OutputStream,因爲OutputStreamWriter的構造函數是以OutputStream爲參數,我們傳人OutputStream會在OutputStreamWriter內部通過轉碼,將字節轉換成字符。

八、字節和字符的輸入流對應關係:


九、字節和字符的輸出流對應關係

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