java io體系
如圖可以看出,java的io按照包來劃分的話可以分為三大塊:io、nio、aio,但是從使用角度來看,這三塊其實揉雜在一起的,下邊我們先來概述下這三塊:
- io:主要包含字符流和字節流,我們常用的文件讀寫,流處理等都要用到,也是本次介紹的重點。jdk1.7之后的io底層部分類經已改為使用阻塞的nio實現了
- nio:jdk1.4后加入,多路非阻塞(多路IO復用模型),此外還實現了buffer、channel、selector、內存映射文件等實現。我們直接使用nio多數情況用于網路編程。
- aio:jdk1.7支持,又叫做nio2,實現了異步非阻塞io。較nio更高效,也主要用于網絡編程。
由于本次主要介紹java基本的io類結構,io類的實現相對簡單(主要是字節或者字符數組的操作),而nio和aio更多時候我們關注的是網絡編程,要想理解需要對unix網絡模型、異步和阻塞等有比較清晰的理解,因此并不會花大量篇幅介紹各個類,示例也僅會給出鏈接。
快寫完的時候看到的一篇,寫的贊,果然水平還差的遠:深入分析 Java I/O 的工作機制
io類結構
常用的類不在介紹,下邊主要介紹一些有特殊功能的類
PipedWriter,PipedReader
管道輸入流,熟悉linux系統應該看到pipe應該就明白了,可以實現線程間通信,需要和PipedReader配套使用。詳解和示例
FilterReader,FilterWriter
根據名字也能看出來,目的事項實現一個流過濾器,但是你會發現其實是個抽象類,并沒有實現,這里只是提供了接口。掃了一下發現jdk里邊只有Utility的一個JavaWriter的靜態類實現了,其功能是將字節轉換成有效的java字符。
CharArrayReader,CharArrayWriter
將字節數組作為輸入或輸出流處理,一般作為中間值,用來將字符數組和其他IO字符處理類轉換。下邊的ByteArrayInputStream與此類似,不過處理的是字節數組。詳解和示例
PushbackReader,PushbackInputStream
具有回推功能的IO處理類,可以將已讀取過的數據再回推到緩沖區中,重復讀取(注意一般的流都是單向的,一旦讀取出來就不能再讀了)。詳解和示例
DataInputStream,DataOutputStream
提供了按照類型或編碼讀取寫入文件的方法,如byte[]、int、short、char、byte、UTF等類型或編碼的讀寫。詳解和示例
SequenceInputStream
如其名字:順序輸入流,改類允許將多個輸入流作為輸入,并按照順序處理多個流,使用的時候當做一個流處理。詳解和示例
RandomAccessFile
該類與其他IO類有較大不同,其支持隨機讀寫,對于格式化的記錄文件讀取很有優勢。此外由于其底層的操作已經改為由nio的FileChannel實現,因此在處理大文件的時候經常使用RandomAccessFile和MappedByteBuffer來讀取,不僅讀取速度更快,而且能夠避免文件過大導致內存溢出。詳解和示例
其他參考博文(侵刪)
- https://www.ibm.com/developerworks/cn/java/j-lo-javaio/
- http://www.cnblogs.com/kuangdaoyizhimei/p/4034232.html
- http://www.cnblogs.com/kuangdaoyizhimei/p/4035611.html
nio和aio相關
上圖是整理的nio與aio的一些關鍵點,瞟一眼就好,詳細的nio講解可參考: Java NIO使用及原理分析