目錄
Java的 IO 類庫的基本架構
1、基於字節操作的I/O接口:InputStream和OutputStream;
2、基於字符操作的I/O接口:Writer和Reader;
3、基於磁盤操作的I/O接口:File;
4、基於網絡操作的I/O接口:Socket。
什麼是 IO 流?
流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱爲流,流的本質是數據傳輸,根據數據傳輸特性將流抽象爲各種類,方便更直觀的進行數據操作。
字節流與字符流
字符流的由來:
因爲數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。
字節流與字符流的區別:
1、讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。
2、處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。
3、字節流:一次讀入或讀出是8位二進制。
4、字符流:一次讀入或讀出是16位二進制。
注:設備上的數據無論是圖片或者視頻,文字,它們都以二進制存儲的。二進制的最終都是以一個8位爲數據單元進行體現,所以計算機中的最小數據單元就是字節。意味着,字節流可以處理設備上的所有數據,所以字節流一樣可以處理字符數據。
因此,只要是處理純文本數據,就優先考慮使用字符流。 除此之外都使用字節流。
輸入流與輸出流
輸入流只能進行讀操作,輸出流只能進行寫操作,程序中需要根據待傳輸數據的不同特性而使用不同的流。
輸入字節流 InputStream
InputStream 是所有的輸入字節流的父類,它是一個抽象類。
常見的輸入字節流如下:
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三種基本的介質流,它們分別從Byte 數組、StringBuffer、和本地文件中讀取數據。
PipedInputStream 是從與其它線程共用的管道中讀取數據。
ObjectInputStream 和所有FilterInputStream 的子類都是裝飾流(裝飾器模式的主角)。
輸出字節流 OutputStream
OutputStream 是所有的輸出字節流的父類,它是一個抽象類。
常見的輸出字節流如下:
ByteArrayOutputStream、StringBufferOutputStream、FileOutputStream 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。
PipedOutputStream 是向與其它線程共用的管道中寫入數據。
ObjectOutputStream 和所有FilterOutputStream 的子類都是裝飾流。
節點流
節點流:直接與數據源相連,讀入或讀出。
常用的節點流:
父類 :InputStream 、OutputStream、 Reader、 Writer。
文件 :FileInputStream 、FileOutputStrean 、FileReader 、FileWriter 文件進行處理的節點流。
數組:ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter 對數組進行處理的節點流(對應的不再是文件,而是內存中的一個數組)。
字符串:StringReader、StringWriter 對字符串進行處理的節點流。
管道:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter對管道進行處理的節點流。
處理流
直接使用節點流,讀寫不方便,爲了更快的讀寫文件,纔有了處理流。
處理流和節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。如BufferedReader 處理流的構造方法總是要帶一個其他的流對象做參數,這是典型的裝飾器模式。一個流對象經過其他流的多次包裝,稱爲流的鏈接。
常用的處理流:
緩衝流:BufferedInputStream 、BufferedOutputStream、 BufferedReader、 BufferedWriter,增加了緩衝功能,避免頻繁讀寫硬盤。
轉換流:InputStreamReader 、OutputStreamReader,實現字節流和字符流之間的轉換。InputStreamReader 、OutputStreamWriter 要InputStream或OutputStream作爲參數,實現從字節流到字符流的轉換。
數據流: DataInputStream 、DataOutputStream 等提供將基礎數據類型寫入到文件中,或者讀取出來。