Java IO 總結
IO的分類
BIO(Blocking I/O):同步阻塞IO
以電腦為中心,InputStream(Reader)就是將外部資料以流的形式載入到電腦的記憶體中,OutputStream(Writer)就是把記憶體中的資料以流的形式向外輸出。
位元組流:以xxStream
命名,一般成對出現,如InputStream
,OutputStream
常見的位元組流:
- 檔案流:
FileInputStream
,FileOutputStream
–用於處理檔案 - 過濾流:
FilterInputStream
,FilterOutputStream
–套在InputStream
和OutputStream
BufferedInputStream
,BufferedOutputStream
–提供緩衝區功能,提升效率- 其他:
DataInputStream
,DataOutputStream
,PrintStream
,PushbackInputStream
…
- 位元組陣列流:
ByteArrayInputStream
,ByteArrayOutputStream
–將資料寫入內部資料,陣列大小隨著資料寫入而動態擴充套件 - 管道流:
PipedInputStream
,PipedOutputStream
–用於多執行緒間管道通訊 - 物件流:
ObjectInputStream
,ObjectOutputStream
字元流:以xxReader
(xxWriter
)命名,功能型別同上
BufferedReader
,BufferedWriter
CharArrayReader
,CharArrayWriter
PipedReader
,PipedWriter
PushbackReader
,PrintWriter
StringReader
,StringWriter
InputStreamReader
,OutputStreamWriter
–將位元組流轉為字元流(注意編碼)
FileReader
,FileWriter
NIO(New I/O):同步非阻塞IO(也支援同步阻塞IO) –since jdk1.4
Java的NIO模型,底層依賴的是作業系統的NIO模型;因此,windows和Linux下的底層實現是不同的。(linux版本大於2.6的話用的是EPoll,小於2.6用的Poll)。
標準IO中,資料打包是以流
的形式,而NIO中是以塊
的形式處理,這樣速度更快。
Channel
通道Channel
是一個物件,用來讀寫資料。它是對流Stream
的模擬,但是流區分方向(Input/Output),而通道沒有方向的概念,可以讀也可以寫。所有資料,都是從通道讀入到緩衝區Buffer
,或者從緩衝區寫入通道。
常用Channel
* FileChannel
* DatagramChannel
* SocketChannel
* ServerSocketChannel
Buffer
緩衝區Buffer
是一個物件,可以看做一個容器,用來存放資料(剛讀入的資料,或者要寫出去的資料)。在NIO中,所有的資料都是在緩衝區裡處理的。緩衝區實質上是一個數組。通常它是一個位元組陣列,但是也可以使用其他種類的陣列。
常用Buffer:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Selector
選擇器Selector
用來監聽1個或多個通道(是否準備好讀寫),從而實現一個執行緒管理多個通道。執行緒之間切換,效能開銷較大,因此,用一個執行緒來維護所有通道比較好。
AIO(Asynchronous I/O, NIO 2.0):非同步非阻塞IO –since jdk1.7
從程式設計模式上來看AIO相對於NIO的區別在於,NIO需要使用者執行緒不停的輪詢IO物件,來確定是否有資料準備好可以讀了,而AIO則是在資料準備好之後,才會通知資料使用者,這樣使用者就不需要不停地輪詢了。當然AIO的非同步特性並不是Java實現的偽非同步,而是使用了系統底層API的支援,在Unix系統下,採用了epoll IO模型,而windows便是使用了IOCP模型。