Java NIO 由如下幾個核心部分組成:服務器
Channels Buffers Selectors 雖然Java NIO 中除此以外還有不少類和組件,但在我看來,Channel,Buffer 和 Selector 構成了核心的API。其它組件,如Pipe和FileLock,只不過是與三個核心組件共同使用的工具類。所以,在概述中我將集中在這三個組件上。其它組件會在單獨的章節中講到。網絡
Channel 和 Bufferapp
基本上,全部的 IO 在NIO 中都從一個Channel 開始。Channel 有點象流。 數據能夠從Channel讀到Buffer中,也能夠從Buffer 寫到Channel中。這裏有個圖示:工具
Channel和Buffer有好幾種類型。下面是JAVA NIO中的一些主要Channel的實現:線程
FileChannel DatagramChannel SocketChannel ServerSocketChannel 正如你所看到的,這些通道涵蓋了UDP 和 TCP 網絡IO,以及文件IO。教程
與這些類一塊兒的有一些有趣的接口,但爲簡單起見,我儘可能在概述中不提到它們。本教程其它章節與它們相關的地方我會進行解釋。接口
如下是Java NIO裏關鍵的Buffer實現:事件
ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer 這些Buffer覆蓋了你能經過IO發送的基本數據類型:byte, short, int, long, float, double 和 char。ip
Java NIO 還有個 MappedByteBuffer,用於表示內存映射文件, 我也不打算在概述中說明。內存
Selector Selector容許單線程處理多個 Channel。若是你的應用打開了多個鏈接(通道),但每一個鏈接的流量都很低,使用Selector就會很方便。例如,在一個聊天服務器中。
這是在一個單線程中使用一個Selector處理3個Channel的圖示:
要使用Selector,得向Selector註冊Channel,而後調用它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,線程就能夠處理這些事件,事件的例子有如新鏈接進來,數據接收等。