1. 程式人生 > >JAVA NIO(死磕1)

JAVA NIO(死磕1)

【正文】JAVA NIO 死磕1: 

JAVA NIO簡介

1. JAVA NIO簡介

Java 中 New I/O類庫 是由 Java 1.4 引進的非同步 IO。由於之前老的I/O類庫是阻塞I/O,New I/O類庫的目標就是要讓Java支援非阻塞I/O,所以,更多的人喜歡稱之為非阻塞I/O(Non-block I/O)。

NIO彌補了原來同步阻塞I/O的不足,它在標準Java程式碼中提供了高速的、面向塊的I/O。

Java NIO 由以下幾個核心部分組成:

Channel

Buffer

Selector

1.1. NIO 和 OIO 的對比

舊的IO(OIO) 和 NIO 的區別主要體現在三個方面:

(1)OIO 基於流(Stream oriented),而 NIO 基於 Buffer (Buffer oriented);

(2)OIO 操作是阻塞的,而 NIO 操作是非阻塞的;

(3)OIO 沒有 selector 概念,而 NIO 有 selector 概念.

舊的IO(OIO) 是面向位元組流或字元流的,在一般的OIO操作中,我們以流式的方式順序地從一個 Stream 中讀取一個或多個位元組,因此,我們也就不能隨意改變讀取指標的位置。

而在 NIO 中,而是引入了 Channel 和 Buffer 的概念。在 NIO 中,只需要從 Channel 中讀取資料到 Buffer 中,或將資料從 Buffer 中寫入到 Channel。並且,不像OIO 那樣是順序操作,在NIO 中,我們可以隨意地讀取任意位置的資料.

1.2. 阻塞和非阻塞

在OIO中,Java 提供的各種 stream 流操作都是阻塞的,例如我們呼叫一個 read 方法讀取一個檔案的內容,那麼呼叫 read 的執行緒會被阻塞住,直到 read 操作完成。

而 NIO 的非阻塞模式允許我們非阻塞地進行 IO 操作。 例如我們需要從網路中讀取資料。在 NIO 的非阻塞模式中,當我們呼叫 read 方法時,如果此時有資料,則 read 讀取並返回; 如果此時沒有資料,則 read 直接返回,而不會阻塞當前執行緒。

NIO的非阻塞,是如何做到的呢?

使用的是通道和通道的多路複用技術。先來看通道Channel。

1.3. Channel

OIO中,通常來說,一個連線使用有兩個流,一個輸入流一個輸出流。通過兩個流不斷的進行輸入和輸出。

與之相對應,NIO中,通常來說,一個連線就是一個通道Channel表示,所有的 NIO 的 I/O 操作都是從 Channel 開始的。 一個 channel 類似於OIO中的兩個 stream的結合體。

1.4. selector

通道Channel要進行多路複用,基礎就是選擇器selector。

Selector是何方神聖?

這是一個IO事件的查詢器,通過 Selector,一個執行緒可以查詢多個 Channel 的 IO 事件的就緒狀態。

我們要做的工作,就是將要進行狀態查詢的Channel(相當於流)註冊到選擇器Seletor中。當我們向一個 Selector 中註冊了 Channel 後,Selector 內部的機制就可以自動地為我們不斷地查詢(select) 這些註冊的 Channel 是否有已就緒的 IO 事件(例如可讀,可寫,網路連線完成等)。

通過這樣的 Selector 機制,我們就可以很簡單地使用一個執行緒高效地管理多個 Channel 了。

1.5. Java NIO Buffer

當我們需要與 NIO Channel 進行互動時,我們就需要使用到 NIO Buffer,即資料從 Buffer讀取到 Channel 中,並且從 Channel 中寫入到 Buffer 中。

Buffer的使用,也是NIO非阻塞的重要的前提和基礎之一。

下面結合例項和原始碼例項,開啟JAVA NIO的死磕之路。次序從Buffer,然後到Channel,最後講最複雜的 Selector多路複用器。



原始碼:


程式碼工程:  JavaNioDemo.zip

下載地址:在瘋狂創客圈QQ群檔案共享。


瘋狂創客圈:如果說Java是一個武林,這裡的聚集一群武痴, 交流程式設計體驗心得
QQ群連結:
瘋狂創客圈QQ群


無程式設計不創客,無案例不學習。 一定記得去跑一跑案例哦


JAVA NIO 死磕全目錄