關(guān)于NIO的概述
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
一.NIO中的幾個(gè)基礎(chǔ)概念
在NIO中有幾個(gè)比較關(guān)鍵的概念:Channel(通道),Buffer(緩沖區(qū)),Selector(選擇器)。
首先從Channel說(shuō)起吧,通道,顧名思義,就是通向什么的道路,為某個(gè)提供了渠道。在傳統(tǒng)IO中,我們要讀取一個(gè)文件中的內(nèi)容,通常是像下面這樣讀取的:
publicclassTest { publicstaticvoidmain(String[] args) throws IOException { File file =newFile( “data.txt”); InputStream inputStream = newFileInputStream(file); byte[] bytes =newbyte[ 1024]; inputStream.read(bytes); inputStream.close(); } }
這里的InputStream實(shí)際上就是為讀取文件提供一個(gè)通道的。
因此可以將NIO 中的Channel同傳統(tǒng)IO中的Stream來(lái)類(lèi)比,但是要注意,傳統(tǒng)IO中,Stream是單向的,比如InputStream只能進(jìn)行讀取操作,OutputStream只能進(jìn)行寫(xiě)操作。而Channel是雙向的,既可用來(lái)進(jìn)行讀操作,又可用來(lái)進(jìn)行寫(xiě)操作。
Buffer(緩沖區(qū)),是NIO中非常重要的一個(gè)東西,在NIO中所有數(shù)據(jù)的讀和寫(xiě)都離不開(kāi)Buffer。比如上面的一段代碼中,讀取的數(shù)據(jù)時(shí)放在byte數(shù)組當(dāng)中,而在NIO中,讀取的數(shù)據(jù)只能放在Buffer中。同樣地,寫(xiě)入數(shù)據(jù)也是先寫(xiě)入到Buffer中。
下面介紹一下NIO中最核心的一個(gè)東西:Selector??梢哉f(shuō)它是NIO中最關(guān)鍵的一個(gè)部分,Selector的作用就是用來(lái)輪詢每個(gè)注冊(cè)的Channel,一旦發(fā)現(xiàn)Channel有注冊(cè)的事件發(fā)生,便獲取事件然后進(jìn)行處理。
比如看下面的這個(gè)例子:
用單線程處理一個(gè)Selector,然后通過(guò)Selector.select()方法來(lái)獲取到達(dá)事件,在獲取了到達(dá)事件之后,就可以逐個(gè)地對(duì)這些事件進(jìn)行響應(yīng)處理。
二.Channel
在前面已經(jīng)提到,Channel和傳統(tǒng)IO中的Stream很相似。雖然很相似,但是有很大的區(qū)別,主要區(qū)別為:通道是雙向的,通過(guò)一個(gè)Channel既可以進(jìn)行讀,也可以進(jìn)行寫(xiě);而Stream只能進(jìn)行單向操作,通過(guò)一個(gè)Stream只能進(jìn)行讀或者寫(xiě);
以下是常用的幾種通道:
- FileChannel
- SocketChanel
- ServerSocketChannel
- DatagramChannel
通過(guò)使用FileChannel可以從文件讀或者向文件寫(xiě)入數(shù)據(jù);通過(guò)SocketChannel,以TCP來(lái)向網(wǎng)絡(luò)連接的兩端讀寫(xiě)數(shù)據(jù);通過(guò)ServerSocketChanel能夠監(jiān)聽(tīng)客戶端發(fā)起的TCP連接,并為每個(gè)TCP連接創(chuàng)建一個(gè)新的SocketChannel來(lái)進(jìn)行數(shù)據(jù)讀寫(xiě);通過(guò)DatagramChannel,以UDP協(xié)議來(lái)向網(wǎng)絡(luò)連接的兩端讀寫(xiě)數(shù)據(jù)。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
關(guān)于NIO的概述下載
相關(guān)電子資料下載
- 一文詳解ZGC關(guān)鍵技術(shù) 26
- OmniOn Power以可靠高效的電源進(jìn)入電動(dòng)汽車(chē)充電市場(chǎng) 167
- SpringBoot物理線程、虛擬線程、Webflux性能比較 37
- Rust語(yǔ)言為什么這么卷? 21
- 什么是分布式鎖 Redis的五種分布式鎖方案 32
- Guava中這些Map的操作,讓我的代碼量減少了50% 70
- java實(shí)現(xiàn)定時(shí)器的四種方式 83
- 基于OkHttp 3.10.0的源碼案例解析 26
- 如何用Rust通過(guò)JNI和Java進(jìn)行交互 120
- JVM指針壓縮的工作原理 66