Java NIO 基本介紹
- Java NIO 全稱 java non-blocking IO,是指 JDK 提供的新 API。從 JDK1.4 開始,Java 提供了一系列改進的輸入/輸出的新特性,被統稱為 NIO(即 New IO),是同步非阻塞的
- NIO 相關類都被放在 java.nio 包及子包下,並且對原 java.io 包中的很多類進行改寫。【基本案例】
- NIO 有三大核心部分:Channel(通道),Buffer(緩沖區), Selector(選擇器)
- NIO是 面向緩沖區 ,或者面向塊 編程的。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動,這就增加了處理過程中的靈活性,使用它可以提供非阻塞式的高伸縮性網絡
- Java NIO的非阻塞模式,使一個線程從某通道發送請求或者讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取,而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此,一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。
- 通俗理解:NIO是可以做到用一個線程來處理多個操作的。假設有10000個請求過來,根據實際情況,可以分配50或者100個線程來處理。不像之前的阻塞IO那樣,非得分配10000個。
- HTTP2.0使用了多路復用的技術,做到同一個連接並發處理多個請求,而且並發請求的數量比HTTP1.1大了好幾個數量級。
NIO 和 BIO 的比較
- BIO 以流的方式處理數據,而 NIO 以塊的方式處理數據,塊 I/O 的效率比流 I/O 高很多
- BIO 是阻塞的,NIO 則是非阻塞的
- BIO基於字節流和字符流進行操作,而 NIO 基於 Channel(通道)和 Buffer(緩沖區)進行操作,數據總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。Selector(選擇器)用於監聽多個通道的事件(比如:連接請求,數據到達等),因此使用單個線程就可以監聽多個客戶端通道
NIO 三大核心類庫簡單介紹
Selector 、 Channel 和 Buffer 的關系圖

- 每個 Channel 都會對應一個 Buffer,讀寫數據都要經過 Buffer
- Selector 對應一個線程, 一個線程可以對應多個 Channel(連接)
- 該圖反應了有三個 Channel 注冊到該 Selector 多路復用器上
- Selector 會不斷地輪詢注冊在其上地 Channel,如果某個Channel發送讀或者寫事件就會被輪詢出來
- Buffer 就是一個內存塊,底層是有一個數組,但 Buffer 不僅僅是一個數組,還提供了對數據的結構化訪問以及維護讀寫位置等信息
- 數據的讀取寫入是通過Buffer, 這個是和BIO 最大的區別, BIO 中要么是輸入流,要么是輸出流, 不能雙向;但是NIO的 Buffer 是可以讀也可以寫, 只需要 flip 方法切換
- channel 是雙向的, 可以返回底層操作系統的情況, 比如 Linux底層的操作系統通道就是雙向的