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

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

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

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