Java nio的3個特性
Java NIO(New IO)是一個可以替代標(biāo)準(zhǔn)Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標(biāo)準(zhǔn)IO不同的IO工作方式。
Channels and Buffers(通道和緩沖區(qū))
標(biāo)準(zhǔn)的IO基于字節(jié)流和字符流進行操作的,而NIO是基于通道(Channel)和緩沖區(qū)(Buffer)進行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。
Asynchronous IO(異步IO)
Java NIO可以讓你異步的使用IO,例如:當(dāng)線程從通道讀取數(shù)據(jù)到緩沖區(qū)時,線程還是可以進行其他事情。當(dāng)數(shù)據(jù)被寫入到緩沖區(qū)時,線程可以繼續(xù)處理它。從緩沖區(qū)寫入通道也類似。
Selectors(選擇器)
Java NIO引入了選擇器的概念,選擇器用于監(jiān)聽多個通道的事件(比如:連接打開,數(shù)據(jù)到達)。因此,單個的線程可以監(jiān)聽多個數(shù)據(jù)通道。
Java NIO 由以下幾個核心部分組成
Channels
Buffers
Selectors
雖然Java NIO 中除此之外還有很多類和組件,但在我看來,Channel,Buffer 和 Selector 構(gòu)成了核心的API。其它組件,如Pipe和FileLock,只不過是與三個核心組件共同使用的工具類。因此,在概述中我將集中在這三個組件上。其它組件會在單獨的章節(jié)中講到。
Channel 和 Buffer
基本上,所有的 IO 在NIO 中都從一個Channel 開始。Channel 有點象流。 數(shù)據(jù)可以從Channel讀到Buffer中,也可以從Buffer 寫到Channel中。這里有個圖示:
Channel和Buffer有好幾種類型。下面是JAVA NIO中的一些主要Channel的實現(xiàn):
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
正如你所看到的,這些通道涵蓋了UDP 和 TCP 網(wǎng)絡(luò)IO,以及文件IO。
與這些類一起的有一些有趣的接口,但為簡單起見,我盡量在概述中不提到它們。本教程其它章節(jié)與它們相關(guān)的地方我會進行解釋。
以下是Java NIO里關(guān)鍵的Buffer實現(xiàn):
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
這些Buffer覆蓋了你能通過IO發(fā)送的基本數(shù)據(jù)類型:byte, short, int, long, float, double 和 char。Java NIO 還有個 Mappedyteuffer,用于表示內(nèi)存映射文件。
Selector
Selector允許單線程處理多個 Channel。如果你的應(yīng)用打開了多個連接(通道),但每個連接的流量都很低,使用Selector就會很方便。例如,在一個聊天服務(wù)器中。
這是在一個單線程中使用一個Selector處理3個Channel的圖示:
要使用Selector,得向Selector注冊Channel,然后調(diào)用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒。一旦這個方法返回,線程就可以處理這些事件,事件的例子有如新連接進來,數(shù)據(jù)接收等。
Java NIO(New IO)是一個可以替代標(biāo)準(zhǔn)Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標(biāo)準(zhǔn)IO不同的IO工作方式。
Channels and Buffers(通道和緩沖區(qū))
標(biāo)準(zhǔn)的IO基于字節(jié)流和字符流進行操作的,而NIO是基于通道(Channel)和緩沖區(qū)(Buffer)進行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。
Asynchronous IO(異步IO)
Java NIO可以讓你異步的使用IO,例如:當(dāng)線程從通道讀取數(shù)據(jù)到緩沖區(qū)時,線程還是可以進行其他事情。當(dāng)數(shù)據(jù)被寫入到緩沖區(qū)時,線程可以繼續(xù)處理它。從緩沖區(qū)寫入通道也類似。
Selectors(選擇器)
Java NIO引入了選擇器的概念,選擇器用于監(jiān)聽多個通道的事件(比如:連接打開,數(shù)據(jù)到達)。因此,單個的線程可以監(jiān)聽多個數(shù)據(jù)通道。
Java NIO 由以下幾個核心部分組成
Channels
Buffers
Selectors
雖然Java NIO 中除此之外還有很多類和組件,但在我看來,Channel,Buffer 和 Selector 構(gòu)成了核心的API。其它組件,如Pipe和FileLock,只不過是與三個核心組件共同使用的工具類。因此,在概述中我將集中在這三個組件上。其它組件會在單獨的章節(jié)中講到。
Channel 和 Buffer
基本上,所有的 IO 在NIO 中都從一個Channel 開始。Channel 有點象流。 數(shù)據(jù)可以從Channel讀到Buffer中,也可以從Buffer 寫到Channel中。這里有個圖示:

Channel和Buffer有好幾種類型。下面是JAVA NIO中的一些主要Channel的實現(xiàn):
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
正如你所看到的,這些通道涵蓋了UDP 和 TCP 網(wǎng)絡(luò)IO,以及文件IO。
與這些類一起的有一些有趣的接口,但為簡單起見,我盡量在概述中不提到它們。本教程其它章節(jié)與它們相關(guān)的地方我會進行解釋。
以下是Java NIO里關(guān)鍵的Buffer實現(xiàn):
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
這些Buffer覆蓋了你能通過IO發(fā)送的基本數(shù)據(jù)類型:byte, short, int, long, float, double 和 char。Java NIO 還有個 Mappedyteuffer,用于表示內(nèi)存映射文件。
Selector
Selector允許單線程處理多個 Channel。如果你的應(yīng)用打開了多個連接(通道),但每個連接的流量都很低,使用Selector就會很方便。例如,在一個聊天服務(wù)器中。
這是在一個單線程中使用一個Selector處理3個Channel的圖示:

要使用Selector,得向Selector注冊Channel,然后調(diào)用它的select()方法。這個方法會一直阻塞到某個注冊的通道有事件就緒。一旦這個方法返回,線程就可以處理這些事件,事件的例子有如新連接進來,數(shù)據(jù)接收等。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
