如圖能夠看出,java的io按照包來劃分的話能夠分爲三大塊:io、nio、aio,可是從使用角度來看,這三塊其實揉雜在一塊兒的,下邊咱們先來概述下這三塊:html
因爲本次主要介紹java基本的io類結構,io類的實現相對簡單(主要是字節或者字符數組的操做),而nio和aio更多時候咱們關注的是網絡編程,要想理解須要對unix網絡模型、異步和阻塞等有比較清晰的理解,所以並不會花大量篇幅介紹各個類,示例也僅會給出連接。
快寫完的時候看到的一篇,寫的贊,果真水平還差的遠:深刻分析 Java I/O 的工做機制java
經常使用的類不在介紹,下邊主要介紹一些有特殊功能的類linux
管道輸入流,熟悉linux系統應該看到pipe應該就明白了,能夠實現線程間通訊,須要和PipedReader配套使用。詳解和示例編程
根據名字也能看出來,目的事項實現一個流過濾器,可是你會發現實際上是個抽象類,並無實現,這裏只是提供了接口。掃了一下發現jdk裏邊只有Utility的一個JavaWriter的靜態類實現了,其功能是將字節轉換成有效的java字符。數組
將字節數組做爲輸入或輸出流處理,通常做爲中間值,用來將字符數組和其餘IO字符處理類轉換。下邊的ByteArrayInputStream與此相似,不過處理的是字節數組。詳解和示例網絡
具備回推功能的IO處理類,能夠將已讀取過的數據再回推到緩衝區中,重複讀取(注意通常的流都是單向的,一旦讀取出來就不能再讀了)。詳解和示例app
提供了按照類型或編碼讀取寫入文件的方法,如byte[]、int、short、char、byte、UTF等類型或編碼的讀寫。詳解和示例dom
如其名字:順序輸入流,改類容許將多個輸入流做爲輸入,並按照順序處理多個流,使用的時候當作一個流處理。詳解和示例異步
該類與其餘IO類有較大不一樣,其支持隨機讀寫,對於格式化的記錄文件讀取頗有優點。此外因爲其底層的操做已經改成由nio的FileChannel實現,所以在處理大文件的時候常常使用RandomAccessFile和MappedByteBuffer來讀取,不只讀取速度更快,並且可以避免文件過大致使內存溢出。詳解和示例編碼
上圖是整理的nio與aio的一些關鍵點,瞟一眼就好,詳細的nio講解可參考: Java NIO使用及原理分析