本篇內(nèi)容介紹了“什么是NIO”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了天全免費(fèi)建站歡迎大家使用!
NIO( No-blocking I/O)顧名思義他是非阻塞的(其實(shí) 可以設(shè)置阻塞與非阻塞兩種模式 ) ,普通的IO流是阻塞的 當(dāng)一個(gè)線程調(diào)用 read() 或 write()時(shí),該線程被 阻塞,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入,該線程在此期間不能再干任何事情了。而 NIO 是非阻塞模式, 若沒有數(shù)據(jù)可用時(shí),該線程可以進(jìn)行其他任務(wù),單獨(dú)的線程可以管理多個(gè)輸入輸出通道,大大提高了CPU使用率。
IO是面向流的,NIO是面向緩沖的, 發(fā)送給一個(gè)通道的所有數(shù)據(jù)都必須首先放到緩沖區(qū)中,同樣地,從通道中讀取的任何數(shù)據(jù)都要先讀到緩沖區(qū)中。也就是說,不會(huì)直接對(duì)通道進(jìn)行讀寫數(shù)據(jù),而是要先經(jīng)過緩沖區(qū)。
Selector 選擇器
NIO 的選擇器允許一個(gè)單獨(dú)的線程來監(jiān)視多個(gè)輸入通道,這個(gè)線程使用一個(gè)選擇器 Selector 通過輪詢的方式去監(jiān)聽多個(gè)通道 Channel 上的事件,從而讓一個(gè)線程就可以處理多個(gè)事件。
Channels
通道 是對(duì)原 I/O 包中的流的模擬 ,是一個(gè)應(yīng)用程序和操作系統(tǒng)交互事件,傳遞內(nèi)容的渠道。 通道與流(Stream)的不同之處在于,流只能在一個(gè)方向上移動(dòng) , 而通道是雙向的,可以用于讀、寫或者同時(shí)用于讀寫。 Channel本身不能直接訪問數(shù)據(jù),Channel只能與Buffer進(jìn)行交互。
所有被 Selector注冊(cè)的通道,只能是繼承了 SelectableChannel 類的子類。
buffer 緩沖區(qū)
緩沖區(qū)用于存儲(chǔ)數(shù)據(jù),一般先向buffer寫入數(shù)據(jù),buffer會(huì)記錄寫下多少數(shù)據(jù),在讀取數(shù)據(jù)之前需要先調(diào)用 flip() 從寫模式改成讀模式。讀完了以后需要調(diào)用 clear() 清空buffer讓他可以重新被寫入.
構(gòu)造方法
ByteBuffer buf = ByteBuffer.allocate(1024
);
向buffer寫入數(shù)據(jù)
writeBuffer.put(str)
從Buffer中讀取數(shù)據(jù)
//根據(jù)緩沖區(qū)可讀字節(jié)數(shù)創(chuàng)建字節(jié)數(shù)組byte[] bytes = new byte[buffer.remaining()]; //將緩沖區(qū)可讀字節(jié)數(shù)組復(fù)制到新建的數(shù)組中buffer.get(bytes);
byte aByte = buf.get();
get()屬于相對(duì)讀,從 position 位置讀取一個(gè) byte,并將 position+1,為下次讀寫作準(zhǔn)備。
byte aByte = buf.get(int index);
屬于絕對(duì)讀,讀取 byteBuffer 底層的 bytes 中下標(biāo)為 index 的 byte,不改 變 position。
Buffer.rewind()將 position 設(shè)回 0,所以你可以重讀 Buffer 中的所有數(shù)據(jù)。limit 保持不變, 仍然表示能從 Buffer 中讀取多少個(gè)元素
SelectionKey
每個(gè)Channel 向 Selector 注冊(cè)時(shí),都將會(huì)創(chuàng)建一個(gè) SelectionKey。SelectionKey 將 Channel 與 Selector 建立了 關(guān)系,并維護(hù)了 channel 事件。
調(diào)用cancel 方法取消鍵,取消的鍵不會(huì)立即從selector中移除,而是添加到 cancelledKeys 中,在下一次 select 操作時(shí)移除它.所以在調(diào)用某個(gè)key 時(shí),需要使用 isValid 進(jìn)行 校驗(yàn).
在向 Selector 對(duì)象注冊(cè)事件時(shí), NIO 共定義了四種:OP_READ(讀)、OP_WRITE(寫)、 OP_CONNECT(請(qǐng)求連接)、OP_ACCEPT(接受連接)
OP_READ: 操作系統(tǒng)的讀緩沖區(qū)有數(shù)據(jù)可讀時(shí)就緒。
OP_WRITE: 操作系統(tǒng)寫緩沖區(qū)有空閑空間時(shí)就緒。一般情況下寫緩沖區(qū)都有空閑空間,小塊數(shù)據(jù)直接寫入即可,沒必要注冊(cè)該操作類型,否則該條件不 斷就緒浪費(fèi) CPU。
OP_CONNECT: 當(dāng) SocketChannel.connect()請(qǐng)求連接成功后就緒。該操作只給客戶端 使用。
OP_ACCEPT: 當(dāng)接收到一個(gè)客戶端連接請(qǐng)求時(shí)就緒。該操作只給服務(wù)器使用。
“什么是NIO”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
本文名稱:什么是NIO
當(dāng)前網(wǎng)址:http://chinadenli.net/article46/jecehg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、虛擬主機(jī)、搜索引擎優(yōu)化、軟件開發(fā)、App開發(fā)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)