Channels(通道)安全
Buffers (緩衝區)服務器
Selectors (選擇器)網絡
雖然Java NIO 中除此以外還有不少類和組件,但Channel,Buffer 和 Selector 構成了核心的API。其它組件,如Pipe和FileLock,只不過是與三個核心組件共同使用的工具類。所以,接下來將集中簡單瞭解這三個組件。併發
基本上,全部的 IO 在NIO 中都從一個Channel 開始。Channel 有點象流。 數據能夠從Channel讀到Buffer中,也能夠從Buffer 寫到Channel中。這裏有個圖示:app
Channel和Buffer有好幾種類型。socket
FileChannel : 用於讀取、寫入、映射和操做文件的通道。(多個併發線程可安全地使用文件通道。)工具
DatagramChannel : 針對面向數據報套接字的可選擇通道。(數據報通道不是網絡數據報套接字的完整抽象。)學習
SocketChannel : 針對面向流的鏈接套接字的可選擇通道。(套接字通道不是鏈接網絡套接字的完整抽象)spa
ServerSocketChannel :針對面向流的偵聽套接字的可選擇通道。(服務器套接字通道不是偵聽網絡套接字的完整抽象。)線程
(後三者並不是完整抽象, 必須經過調用 socket方法所得到的關聯 ServerSocket 對象來完成對套接字選項的綁定和操做。不可能爲任意的已有服務器套接字建立通道,也不可能指定與服務器套接字通道關聯的服務器套接字所使用的SocketImpl 對象。)
ByteBuffer:字節緩衝區。
CharBuffer:字符緩衝區。
DoubleBuffer:double 緩衝區。
FloatBuffer:float 緩衝區。
IntBuffer:int 緩衝區。
LongBuffer:long 緩衝區。
ShortBuffer:short 緩衝區。
MappedByteBuffer:直接字節緩衝區,其內容是文件的內存映射區域。(映射的字節緩衝區是經過FileChannel .map 方法建立的。此類用特定於內存映射文件區域的操做擴展 ByteBuffer 類。)
這些Buffer覆蓋了你能經過IO發送的基本數據類型:byte, short, int, long, float, double 和 char。
Selector容許單線程處理多個 Channel。若是你的應用打開了多個鏈接(通道),但每一個鏈接的流量都很低,使用Selector就會很方便。
例如,在一個聊天服務器中。這是在一個單線程中使用一個Selector處理3個Channel的圖示:
要使用Selector,得向Selector註冊Channel,而後調用它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,線程就能夠處理這些事件,事件的例子有如新鏈接進來,數據接收等。
更多學習:
http://ifeve.com/overview/ (在此原文連接上加了點註釋)