說到IO,在咱們工做中是常常遇到的,好比文件的上傳、網絡的數據傳輸、系統的日誌記錄等,俯拾皆是。Java裏面是怎麼實現IO的,今天咱們一塊兒學習下。java
Java種IO是經過流的方式實現的,流能夠理解爲一個序列的數據,Java中定義了字節流和字符流,字節流顧名思義它處理的基本單位就是字節,字符流處理的基本單元是Unicode碼元(1字符=2字節),String類型叫作字符串,字符串在內存裏也是Unicode的碼元。流還有另一種分類方法,就是輸入流和輸出流,把對象(文件、圖片等)讀入程序中須要用輸入流,程序中須要寫入文件時須要用輸出流,這只是一個方向的問題。下面作下簡單整理:設計模式
JDK中java.io包下是關於io操做的類。按照上面的分類,看下都有哪些類,下圖是我收藏的一張關於JDK中IO部分的分類:數組
1. 字符流網絡
StringReader、CharArrayReader是主要的介質類,分別從String和Char數組中讀取數據;學習
PipedReader是一個管道流,是從與其餘線程共用的管道中讀取數據;編碼
BufferedReader是一個裝飾器類(若是對裝飾者模式不熟悉的,能夠查看個人設計模式篇中的裝飾者模式的介紹),spa
FilterReader是個抽象類,他是PushbackReader類的父類。線程
InputStreamReader是鏈接字符流和字節流的橋樑,它能夠將字節流轉換爲字符流。FileReader就是它的一個子類,實現了將文件的輸入字節流轉換爲輸入字符流的功能。設計
CharArrayWriter、StringWriter是兩種基本的介質流,分別面向Char數組、String寫入數據。日誌
PipedWriter是一個管道輸出流,向與其餘共用的管道中寫入數據
BufferedWriter是一個裝飾器類,爲Writer子類提供緩衝功能。
OutputStreamWriter是OutputStream到Writer轉換的橋樑,FileWriter是它的子類,實現了將文件輸出字節流轉換爲輸出字符流的功能。
2. 字節流
FileInputStream、StringBufferInputStream、ByteArrayInputStream是字節輸入流的三個介質類,分別從本地文件、String緩衝區、Byte數組中讀取數據;其中的StringBufferInput已經再也不建議使用了
FilterInputStream是裝飾器類的父類,下面有BufferedInputStream、DataInputStream、PushbackInputStream
ObjectInpuStream、SequenceInputStream都是裝飾器類
PipedInputStream是一個管道字節流, 是從與其它線程共用的管道中讀取數據
FileOutputStream、ByteArrayOutputStream是兩個基本的介質流類,分別向本地文件、byte數組寫入數據。PipedOutputStream是向與其餘線程共用的管道中寫入數據。
ObjectOutputStream及FilterOutputStream的子類都是裝飾器類。
3. 字節流和字符流的使用場景
JDK早期版本中就提供了字節流和字符流的兩種處理方式,字符流的處理單位是碼元,效率比字節要高一些,可是並不表明字符流就比字節流具備優點。好比常見的圖片,由於它的編碼格式和常規的字符編碼格式不一致,因此字符流對於圖片這類文件就顯者一籌莫展了。字節流和字符流各具優點,不能互相代替。
這一篇,對IO部分有了初步的認識,下篇將介紹IO的發展史,什麼是BIO、NIO、AIO。歡迎關注。