#30天專注成長計(jì)劃#day 17java并發(fā)多線程-NIO-Channel

實(shí)例實(shí)現(xiàn)

在代碼中使用channel 通道,將本地的一個文件數(shù)據(jù)寫入另一個文件當(dāng)中,每次最多讀取100個字節(jié)。

1.什么是NIO?

NIO 是New I/O 的簡稱,與舊式的基于流的I/O 方法相對,從名字看,他標(biāo)示新的一套Java I/O 標(biāo)準(zhǔn),它是在Java1.4中被納入到JDK 中的,并具有以下特性:

1.NIO 是基于塊(block) 的,它以塊為基本單位處理數(shù)據(jù),計(jì)算機(jī)硬盤上的存儲單位也是基于塊的,所以讀寫效率更高
2.為所有的原始類型提供緩存支持(buffer)
3.增加通道(channel) 對象,作為新的原始I/O 抽象
4.支持鎖和內(nèi)存映射文件的文件訪問借口哦
5.提供了基于Selector 的異步網(wǎng)絡(luò)I/O

2.緩存和內(nèi)存的區(qū)別是什么?

網(wǎng)上的專業(yè)的講解,但是今天我想通過隱喻來講解自己所理解的他們之間的區(qū)別,說的不對的地方請拍磚。

專業(yè)解釋

緩存是集成于CPU當(dāng)中,作為CPU運(yùn)算的存儲支撐。由于CPU芯片面積和成本的因素來考慮,緩存都很小?,F(xiàn)在一般的緩存不過幾M。CPU內(nèi)緩存的運(yùn)行頻率極高,一般是和處理器同頻運(yùn)作,工作效率遠(yuǎn)遠(yuǎn)大于系統(tǒng)內(nèi)存和硬盤。實(shí)際工作時,CPU往往需要重復(fù)讀取同樣的數(shù)據(jù)塊,而緩存容量的增大,可以大幅度提升CPU內(nèi)部讀取數(shù)據(jù)的命中率,而不用再到內(nèi)存或者硬盤上尋找,以此提高系統(tǒng)性能。
內(nèi)存則是作為CPU與硬盤間的存儲支撐。插在主板的內(nèi)存槽中?,F(xiàn)在內(nèi)存一般為1~2G。即1G=1024M
它是與CPU進(jìn)行溝通的橋梁。計(jì)算機(jī)中所有程序的運(yùn)行都是在內(nèi)存中進(jìn)行的,因此內(nèi)存的性能對計(jì)算機(jī)的影響非常大。 內(nèi)存(Memory)也被稱為內(nèi)存儲器,其作用是用于暫時存放CPU中的運(yùn)算數(shù)據(jù),以及與硬盤等外部存儲器交換的數(shù)據(jù)。只要計(jì)算機(jī)在運(yùn)行中,CPU就會把需要運(yùn)算的數(shù)據(jù)調(diào)到內(nèi)存中進(jìn)行運(yùn)算,當(dāng)運(yùn)算完成后CPU再將結(jié)果傳送出來,內(nèi)存的運(yùn)行也決定了計(jì)算機(jī)的穩(wěn)定運(yùn)行。

隱喻

我想用江河湖泊的水,1000ml杯中的水,口中的水,身體需要。來做比喻
將入我們的身體需要喝水,怎么樣最快喝到水呢??隙ㄊ强诶锩嬗写罅康乃?,我們直接咽下去就可以了。但是事實(shí)是我們口里面能裝的水是有限的,需要從被子里面取。
在這里我我把杯中的水比作內(nèi)存,口里的水比作緩存。江河湖泊里面的水比作硬盤。

3.什么是Channel ,有什么特點(diǎn)?

Channel類似于傳統(tǒng)的流對象,但與傳統(tǒng)的流對象有兩個主要區(qū)別:

1、Channel可以直接將指定文件的部分或全部直接映射成Buffer。
2、程序不能直接訪問Channel中的數(shù)據(jù),包括讀、寫入都不行,Channel只能與Buffer進(jìn)行交互。也就是說,如果要從Channel中取得數(shù)據(jù),必須先用Buffer從Channel中取出一些數(shù)據(jù),然后讓程序從Buffer中取出這些數(shù)據(jù);如果要將程序中的數(shù)據(jù)寫入Channel,一樣先讓程序?qū)⒄l放入Buffer中,程序再將Buffer里的數(shù)據(jù)寫入Channel中,模型圖如下:

Paste_Image.png

4.JDK channel 接口與類圖

a3b2f3dd-8113-43d6-87ee-26d300ad5db1.png

5.JDK Buffer 抽象類與子類結(jié)構(gòu)圖

9eb0a493-2ded-4f85-ad01-d4365c0fd8c0.png

6.實(shí)現(xiàn)實(shí)例的代碼(介紹完了,應(yīng)該實(shí)踐一下)

ceb8b173-b877-43b6-acb1-854233cf7b16.png

代碼注意:

bb.flip();一定得有,如果沒有,就是從文件最后開始讀取的,當(dāng)然讀出來的都是byte=0時候的字符。通過bb.flip();這個語句,就能把buffer的當(dāng)前位置更改為buffer緩沖區(qū)的第一個位置

測試結(jié)果如下

ee5c124a-8b2f-4b19-a9fe-49b05ad1ec69.png

6.增加一點(diǎn)氣氛

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

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

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