Java NIO由以下幾個核心組件組成:
- Channels
- Buffers
- Selectors
Java NIO擁有的類和組件比這些要多膳叨,但是channel
,Buffer
和Selector
組成了這個API的核心。在我(原作者)看來,像Pipe
和`FileLock這些類僅僅只是用于將這三個核心組件結(jié)合在一起用的户敬。所以,概述這一節(jié)僅關(guān)注這三個組件计寇,其他組件在其他單獨(dú)的章節(jié)中介紹仙蚜。
Channels和Buffers
一個典型的NIO從Channels開始。Channel有點(diǎn)像流翔悠,數(shù)據(jù)能從Channel讀到Buffer中业崖,也能從Buffer寫到Channels中。如下圖所示:
Channels read data into Buffers, and Buffers write data into Channels
Channel和Buffer有好幾種類型蓄愁,下面是Java NIO的幾種實現(xiàn):
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
可以看到双炕,這些通路涵蓋了UDP和TCP網(wǎng)絡(luò)IO以及文件IO。
和這些類一起也有一些有趣的接口撮抓,簡潔起見妇斤,概述一節(jié)不做介紹,在本教程其他涉及到他們的地方再做解釋丹拯。
下面是Java NIO中Buffer的一些核心的實現(xiàn):
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
這些Buffer涵蓋了你能通過IO傳輸?shù)幕A(chǔ)數(shù)據(jù)類型:字節(jié)站超,短整型,整型乖酬,長整型死相,浮點(diǎn)數(shù),雙精度浮點(diǎn)數(shù)和字符咬像。
Java NIO還有一個MappedByteBuffer媳纬,用于將內(nèi)存映射文件關(guān)聯(lián)起來。這里也省略不做介紹施掏。
Selector
Selector允許單個線程處理多個Channel钮惠。如果應(yīng)用打開了很多連接(Channels),但是每個連接的流量又很少七芭,它就非常好用了素挽。例如聊天室服務(wù)器。
以下是一個例子狸驳,單線程使用一個Selector處理三個Channel
A Thread uses a Selector to handle 3 Channel's
要使用Selector预明,需要用它注冊Channel缩赛,然后調(diào)用它的select()方法。這個方法將會阻塞直到某個注冊的通路有事件就緒撰糠。一旦這個方法返回酥馍,線程將會處理這些事件。例如新入連接阅酪,數(shù)據(jù)就緒等旨袒。