Java-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內部通過轉碼,將位元組轉換成字元。

八、位元組和字元的輸入流對應關係:

九、位元組和字元的輸出流對應關係