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)載請注明出處。