原文連線 Java NIO Overview
Java NIO 包含了一下核心元件。
-
Channels
-
Buffers
-
Selectors
Java NIO 中的類和元件遠遠多於這三個,在我看來 Channel
, Buffer
和 Selector
構成了 API 的核心,其餘元件像 Pipe
和 FileLock
只不過是為了配合三個核心元件而結合使用的類罷了。因此,在本節概述中我會重點講解這個三個核心元件。其他元件會在本教程中各自章節分別介紹。
通道和緩衝區(Channels and Buffers)
通常來講,在 NIO 中所有的 IO 操作都開始於 Channel
,Channel
就像位元組流一樣,資料可以從 Channel
讀取,然後寫到 Buffer
中。也可以從 Buffer
中讀取寫入到 Channel
中 。
Channel
和 Buffer
有比較多的型別。下面列舉了在主要的幾種 Channel
。
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如你所見,這些 Channel
覆蓋了 UDP + TCP 網路 IO ,以及檔案 IO。
伴隨著這些 Channel
還會有一些其他的比較有趣的介面,簡單起見,本章節暫不做介紹,我會在本系列教程的相關地方引入這些介面。
下面是 NIO 中核心 Buffer
實現類的列表。
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
這些 Buffer
涵蓋了可以通過 IO 傳送的基礎資料型別:byte, short, int, long, float, double and characters。
NIO 還有一個用於和記憶體對映檔案一起使用的 MappedByteBuffer
,同樣本章節先不做介紹。
選擇器(Selectors)
選擇器允許單個的執行緒操作多個 Channel
,如果你的應用是那種要開啟很多連線但是每個連線的資料傳輸量又比較低,這個特性是相當便利的。例如聊天伺服器。
下面是一個執行緒操作三個 Channel
的示意圖。
使用 selector
之前你必須先把 Channel
註冊到 selector
上,之後你就可以呼叫它的 select()
方法,該方法是阻塞的,直到有一個 Channel
的狀態符合條件,方法返回後執行緒就可以處理接下來的流程。事件的示例有傳入連線,接受資料等等。
譯者注:如果你是第一次瞭解 NIO 的話,你可能會對這裡有些疑問。實際上是這個樣子的,
Channel
註冊到selector
上時會指定一個特定事件,選擇器會監聽該Channel
上的特定事件,當特定事件滿足時,select()
方法就會返回。