io和Java Nio、Aio

java的I/O是建立在流(stream)之上的,而流是同步的,當(dāng)線程請求一個(gè)流讀/寫一段數(shù)據(jù)時(shí),線程會(huì)一直阻塞下去,直到有數(shù)據(jù)、數(shù)據(jù)讀寫完畢或發(fā)生異常時(shí)線程才會(huì)被重新使用。


BIO編程的基本模型是Client/Server模型,也就是兩個(gè)進(jìn)程之間進(jìn)行相互通信,其中服務(wù)器提供位置(ip,port)信息,客戶端通過連接服務(wù)器監(jiān)聽的位置發(fā)請求,通過三次握手建立連接,若成功,則通過Socket進(jìn)行通信,基于輸入和輸出流的同步阻塞式通信。



NIO(非阻塞I/O)編程

NIO是在JDK 1.4中引入的,人們習(xí)慣稱呼為New I/O或非阻塞I/O(Non-block I/O),與原始Socket/ServerSocket類相對應(yīng),它提供了SocketChannel和ServerSocketChannel兩種不同的套接字通道實(shí)現(xiàn),與基于同步流的I/O不同,它提供了基于緩沖區(qū)Buffer的阻塞和非阻塞兩種開發(fā)模式。要學(xué)習(xí)NIO首先得掌握它如下的幾個(gè)核心概念

NIO緩沖區(qū)概念,上面提過,NIO是面向緩沖塊的高速I/O,在面向流的I/O中,可以將數(shù)據(jù)直接寫入或讀取到Stream對象中,在NIO庫中,所有數(shù)據(jù)都是通過緩沖區(qū)處理的。

緩沖區(qū)實(shí)質(zhì)是一個(gè)數(shù)組


通道Channel

Channel是一個(gè)通道,網(wǎng)絡(luò)數(shù)據(jù)通過channel讀取和寫入。通道與流的不同在于通道是雙向的,支持阻塞和非阻塞兩種模式。

多路復(fù)用器 Selector

Selector會(huì)輪詢注冊在其上的channel,如果某個(gè)channel發(fā)生讀或?qū)懯录?,這個(gè)channel就處于就緒狀態(tài),會(huì)被Selector輪詢出來,然后通過SelectionKey獲取已經(jīng)就緒的channel集合,進(jìn)行后續(xù)的I/O操作。

一個(gè)多路復(fù)用器Selector可以同時(shí)輪詢多個(gè)Channel,一個(gè)線程負(fù)責(zé)Selector的輪詢,就可以接入成千上萬個(gè)客戶端。


NIO是同步非阻塞IO,同步是因?yàn)閺?fù)用器會(huì)不斷輪詢注冊在其上的channel,但是相比于之前的同步阻塞I/O流,它是異步的,所以很多人也稱呼NIO為異步非阻塞I/O,但實(shí)際上它是同步的。


四)AIO編程

NIO2.0引入AIO,提供了異步文件通道和異步套接字同步,實(shí)現(xiàn)了真正意義上的異步非阻塞I/O。它不需要通過多路復(fù)用器Selector對注冊的通道進(jìn)行輪訓(xùn)操作即可實(shí)現(xiàn)異步讀寫,從而簡化了NIO的編程模型。

它提供兩種方式來獲取異步操作結(jié)果

通過Future類來表示異步操作的結(jié)果。

在執(zhí)行異步操作時(shí)傳入一個(gè)CompletionHandler接口的實(shí)現(xiàn)類作為操作完成的回調(diào)。

作者:miss2008

鏈接:http://www.itdecent.cn/p/2db793d1c873

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容