Java NIO由以下幾個部分組成
- Channels
- Buffers
- Selecters
雖然Java NIO除此之外還包括更多的元件,但在我看來,Channel,Buffer,Selecter構成了核心API。其它的元件,如Pipe和FileLock僅僅是這三個核心元件使用的工具類。因此,在NIO概述中我將關注這三個元件。其它元件將在各自的章節中講到。目錄詳見左上角。
Channel 和 Buffer
基本上,NIO中的所有IO都由Channel開始。一個Channel與流相似,通過Channel,資料可以被讀入到Buffer中,資料同樣可以從緩衝區寫入到Channel。這裡有個圖示:
Channel和Buffer有好幾種型別。以下是Java NIO中幾種主要的Channel。
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
正如你所見到的,這些通道包括了TCP和UDP的網路IO和檔案IO。
與這些類一起的還有些有趣的介面,但是為簡單起見,我在概述中儘量不提他們。他們將在其它章節相關的地址進行詳細介紹。
以下是一些在Java NIO中實現的核心Buffer。
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
這些Buffer覆蓋了你通過IO傳送的基本資料型別,:byte, short, int, long, float, double 和 char。
Java NIO也提供了MappedByteBuffer來進行記憶體檔案的對映,我也不打算在概述中進行說明。
Selectors
Selector允許一個執行緒控制多個通道,如果你的應用程式有許多連線(通道)開啟,並且每個連線的流量都非常小,這將變得非常方便,例如在一個聊天伺服器中。 下圖是一個使用單執行緒使用Selector.
在使用Selector前需要在Channel中註冊它。然後你可以呼叫select()方法,這個方法將會阻塞直到註冊的通道中有準備好的事件。一旦這個方法返回,這個執行緒可以處理這些事件,事件的例子有新連線進來,資料到達等。