Java NIO 主要包括一下核心組件:
- Channels
- Buffers
- Selectors
Java NIO的類(lèi)遠(yuǎn)不止這些,但是Channel,Buffer和Selector構(gòu)成了API的核心。其他組件,如Pipe和FileLock,僅僅是與三個(gè)核心組件結(jié)合使用的實(shí)用工具類(lèi)。 因此,我將在本節(jié)NIO概述中關(guān)注這三個(gè)組件。
Channels and Buffers
通常,NIO中的所有IO都以一個(gè)通道開(kāi)始。 通道有點(diǎn)像流。 在通道中,數(shù)據(jù)可以被讀入緩沖區(qū)。 數(shù)據(jù)也可以從緩沖區(qū)寫(xiě)入通道。 這是一個(gè)例子:

通道將數(shù)據(jù)讀入緩沖區(qū),緩沖區(qū)將數(shù)據(jù)寫(xiě)入通道
有幾種通道和緩沖類(lèi)型。以下是Java NIO中通道的實(shí)現(xiàn)類(lèi)列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
這些通道涵蓋UDP + TCP網(wǎng)絡(luò)IO和文件IO的處理。
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
這些Buffer覆蓋了可以通過(guò)IO發(fā)送的基本數(shù)據(jù)類(lèi)型:byte,short,int,long,float,double和characters。Java NIO也有一個(gè)與內(nèi)存映射文件結(jié)合使用的MappedByteBuffer。
Selectors
Selectors允許單個(gè)線程處理多個(gè)Channel。如果你的應(yīng)用程序有許多通道代開(kāi),但是每個(gè)連接流量都很低,那么Selecttor會(huì)給你帶來(lái)便利。例如:聊天服務(wù)器。
下面是一個(gè)使用Selector處理3個(gè)Channel的線程的例子:

一個(gè)線程利用Selector處理3個(gè)Channel
要使用Selector,你必須注冊(cè)Channel到這個(gè)Selector。然后調(diào)用select()方法,這個(gè)方法會(huì)阻塞直到有事件(數(shù)據(jù)讀取,連接建立)已經(jīng)準(zhǔn)備好。一旦該方法返回,該線程就可以處理這個(gè)事件。
上一節(jié):Java NIO 教程
下一節(jié):Java NIO Channel