Java知識IO流詳解
有人以爲IO知識不過重要,其實否則,IO的使用範圍很廣,最能體現IO價值的就是網絡上的數據傳遞,尤爲是進入互聯網時代後,各類常見的分佈式架構,都少不了IO的體現。而且不少大廠的面試題中都會體現出對IO的重視,包括衍生出來的NIO、序列化等等。所以學好IO,變成了一件很重要的事情。
IO基本概念
IO能夠簡單的理解成INPUT和OUT,表明輸入輸出的意思。輸入就是讀,輸出就是寫。
IO能夠讀寫硬盤、光盤、內存、鍵盤、網絡等資源上的數據。
流
IO中的流就至關於現實生活中的水流同樣,一打開自來水的龍頭開關,水就從一頭流向另外一頭。能夠理解成每一個按順序排列的水滴就是須要傳輸的字節。把有序數據理解成流,流負責傳輸數據,以便於輸入輸出。數據是流動的,是有方向的流動。
流的分類
按數據的走向能夠分爲:輸入流,輸出流。
按數據的單位能夠分爲:字節流、字符流。
按裝飾模式能夠分爲:節點流(底層)、處理流(上層)。
輸入流與輸出流
輸入流:只能從中讀取數據,而不能向其寫入數據。通常用於將數據從網絡、硬盤讀取到內存中。
輸出流:只能向其寫入數據,而不能從中讀取數據。通常用於將數據從內存中寫入到網絡、硬盤。
輸入流主要由InputStream和Reader做爲父類。
輸出流主要由OutputStream和Writer做爲父類。
他們都是抽象的,所以沒法直接建立對象。
字節流與字符流
字節流與字符流的用法幾乎徹底同樣,區別在於所操做的單位不一樣,字節流操做8位的字節,
而字符流操做16位的字符。
字節流主要由InputStream和OutputStream做爲父類。
字符流主要由Reader和Writer做爲父類。
節點流與處理流
節點流(上層):
向特定的節點寫入&讀取數據的流。程序鏈接到實際的數據源,和實際的輸入輸出節點鏈接。
處理流(底層):
對一個已存在的流進行鏈接或封裝,經過封裝後的流來實現數據讀寫功能。
使用處理流進行輸入輸出時,程序不會和實際的輸入輸出節點鏈接,對底層的處理流作了一層封裝。
程序能夠採用相同的輸入輸出代碼來訪問不一樣的數據源。(涉及到裝飾器模式)
處理流使得java程序無需理會輸入輸出的節點是磁盤、網絡仍是其餘,
只要將這些節點流包裝成處理流,
就能夠使用相同的輸入輸出代碼來讀寫不一樣的輸入輸出設備的數據。
節點流用於和底層的物理存儲節點直接關聯,不一樣的物理節點獲取節點流的方式可能存在差別。
程序能夠把不一樣的物理節點流包裝成統一的處理流,
容許程序使用統一的輸入輸出代碼來讀寫不一樣的物理存儲節點資源。
經常使用的輸入輸出流體系
io流按功能分紅許多類,每一個功能又提供字節流和字符流,
字節流與字符流又分別提供了輸入流與輸出流。若是輸入輸出的是文本內容能夠使用字符流,若是輸入輸出的是二進制內容,能夠使用字節流。
字節流
字節流是IO最原始的方式,由於計算機處理數據老是以一個byte爲基本單位的,字節流就是每次讀取的單位爲byte。字節流是全部流的基礎,也是其餘高級流的前提。字節流能夠處理全部類型的數據,包括:音樂、圖片、文字、視頻、各類文件等等。多數以"Stream"結尾的類都是字節流。
字符流
字符流只能處理文本,讀寫的單位是字符。多數以"Writer"與"Reader"結尾的類都是字節流。java