?在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是字符類型的文件輸入流,通常用于對文件進行讀取操作。