實(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中,模型圖如下:

4.JDK channel 接口與類圖

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

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

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

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