( NIO) 庫 是在 JDK 1. 4 中 引入 的。 NIO 彌補 了 原來 同步 阻塞 I/ O 的 不足, 它在 標準 Java 代碼 中 提供 了 高速 的俭正、 面向 塊 的 I/ O谷扣。 通過 定義 包含 數(shù)據(jù) 的 類, 以及 通過 以 塊 的 形式 處理 這些 數(shù)據(jù)芹彬, NIO 不用 使用 本機 代碼 就可以 利用 低級 優(yōu)化蓄髓, 這是 原來 的 I/ O 包 所 無法 做到 的。
1.緩沖區(qū)Buffer
Buffer 是一 個 對象舒帮, 它 包含 一些 要 寫入 或者 要 讀出 的 數(shù)據(jù)会喝。 在 NIO 類 庫 中 加入 Buffer 對象, 體現(xiàn) 了 新 庫 與 原 I/ O 的 一個 重要 區(qū)別玩郊。而在面向流的 I/ O 中肢执, 可以將數(shù)據(jù)直接寫入或者將數(shù)據(jù)直接讀到 Stream 對象中。
在NIO庫中译红,所有的數(shù)據(jù)都是通過緩存區(qū)處理的预茄。在讀取數(shù)據(jù)時是從緩存中讀取侦厚;在寫入數(shù)據(jù)時耻陕,寫到緩沖區(qū)中。
緩沖區(qū)實質(zhì)上是一個數(shù)組刨沦。通常它是一個字節(jié)數(shù)組(ByteBuffer)诗宣,也可以使用其他種類的數(shù)組。但是一個緩沖區(qū)不僅僅是一個數(shù)組想诅,緩沖區(qū)提供了對數(shù)據(jù)的結(jié)構(gòu)化訪問以及維護讀寫位置(limit)等信息召庞。
ShortBuffer: 短 整型 緩沖區(qū)
IntBuffer: 整形 緩沖區(qū)
LongBuffer: 長 整形 緩沖區(qū)
FloatBuffer: 浮點 型 緩沖區(qū)
DoubleBuffer: 雙 精度 浮點 型 緩沖區(qū)
2.通道 Channel
Channel 是一 個 通道岛心, 可以 通過 它 讀取 和 寫入 數(shù)據(jù), 它 就 像 自來 水管 一樣篮灼, 網(wǎng)絡 數(shù)據(jù) 通過 Channel 讀取 和 寫入忘古。 通道 與 流的 不同 之處 在于 通道 是 雙向 的, 流 只是 在 一個 方向 上 移動( 一個 流 必須 是 InputStream 或者 OutputStream 的 子類)穿稳, 而且 通道 可以 用于 讀存皂、 寫 或者 同時 用于 讀寫。
Channel是全雙工的
3.多路 復 用 器 Selector
多路 復 用 器 Selector逢艘, 它是JavaNIO編程基礎旦袋,熟練掌握 Selector 對于掌握 NIO 編程 至關(guān)重要。 多路復用器提供選擇已經(jīng)就緒的任務的能力它改。 簡單來講 Selector 會 不斷地輪詢注冊在其上的Channel疤孕, 如果某個Channel上面有新的TCP連接接入、 讀 和 寫 事件央拖, 這個 Channel 就 處于 就緒 狀態(tài)祭阀, 會被 Selector 輪 詢 出來, 然后 通過 SelectionKey 可以 獲取 就緒 Channel 的 集合鲜戒, 進行 后續(xù) 的 I/ O 操作专控。