Java NIO是在jdk1.4開始使用的,它既可以說成新IO(New I/O),也可以說成非阻塞式I/O(Non-blocking IO)。
Java IO和NIO的主要區別
面向流與面向緩衝區
IO是面向流的。面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,數據沒有存在任何緩衝區。
NIO是面向緩衝區的。 面向緩衝區意味着數據讀取到一個緩衝區,需要時可在緩衝區中前後移動讀取數據。
阻塞與非阻塞IO
Java IO的各種流的讀寫是阻塞的。當一個線程調用read() 或 write()時,該線程被阻塞。阻塞可能帶來頻繁的上下文切換。
Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麼都不會獲取,而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此。線程通常將非阻塞IO的空閒時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。
一對一和一對多
Java IO處理每一個輸入/輸出都要維護一個單獨的線程。
Java NIO的選擇器(Selectors)允許一個單獨的線程來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
Java NIO核心部分介紹
Java NIO中核心部分爲:
- Channels
- Buffers
- Selectors。
Channel
Channel 有點象流,數據可以從Channel讀到Buffer中,也可以從Buffer寫到Channel中。
JAVA NIO中的一些主要Channel的實現:
- FileChannel(文件IO)
- ServerSocketChannel(TCP網絡IO)
- SocketChannel(TCP網絡IO)
- DatagramChannel(UDP網絡IO)
Buffer
JAVA NIO中的一些主要Buffer的實現:
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Selector
Selector允許單線程處理多個 Channel。