Java NIO使用及原理分析(二)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
轉(zhuǎn)載自:李會(huì)軍?寧?kù)o致遠(yuǎn)
?
在第一篇中,我們介紹了NIO中的兩個(gè)核心對(duì)象:緩沖區(qū)和通道,在談到緩沖區(qū)時(shí),我們說緩沖區(qū)對(duì)象本質(zhì)上是一個(gè)數(shù)組,但它其實(shí)是一個(gè)特殊的數(shù)組,緩沖區(qū)對(duì)象內(nèi)置了一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況,如果我們使用get()方法從緩沖區(qū)獲取數(shù)據(jù)或者使用put()方法把數(shù)據(jù)寫入緩沖區(qū),都會(huì)引起緩沖區(qū)狀態(tài)的變化。本文為NIO使用及原理分析的第二篇,將會(huì)分析NIO中的Buffer對(duì)象。
在緩沖區(qū)中,最重要的屬性有下面三個(gè),它們一起合作完成對(duì)緩沖區(qū)內(nèi)部狀態(tài)的變化跟蹤:
position:指定了下一個(gè)將要被寫入或者讀取的元素索引,它的值由get()/put()方法自動(dòng)更新,在新創(chuàng)建一個(gè)Buffer對(duì)象時(shí),position被初始化為0。
limit:指定還有多少數(shù)據(jù)需要取出(在從緩沖區(qū)寫入通道時(shí)),或者還有多少空間可以放入數(shù)據(jù)(在從通道讀入緩沖區(qū)時(shí))。
capacity:指定了可以存儲(chǔ)在緩沖區(qū)中的最大數(shù)據(jù)容量,實(shí)際上,它指定了底層數(shù)組的大小,或者至少是指定了準(zhǔn)許我們使用的底層數(shù)組的容量。
以上四個(gè)屬性值之間有一些相對(duì)大小的關(guān)系:0 <= position <= limit <= capacity。如果我們創(chuàng)建一個(gè)新的容量大小為10的ByteBuffer對(duì)象,在初始化的時(shí)候,position設(shè)置為0,limit和 capacity被設(shè)置為10,在以后使用ByteBuffer對(duì)象過程中,capacity的值不會(huì)再發(fā)生變化,而其它兩個(gè)個(gè)將會(huì)隨著使用而變化。四個(gè)屬性值分別如圖所示:
?
現(xiàn)在我們可以從通道中讀取一些數(shù)據(jù)到緩沖區(qū)中,注意從通道讀取數(shù)據(jù),相當(dāng)于往緩沖區(qū)中寫入數(shù)據(jù)。如果讀取4個(gè)自己的數(shù)據(jù),則此時(shí)position的值為4,即下一個(gè)將要被寫入的字節(jié)索引為4,而limit仍然是10,如下圖所示:
?
下一步把讀取的數(shù)據(jù)寫入到輸出通道中,相當(dāng)于從緩沖區(qū)中讀取數(shù)據(jù),在此之前,必須調(diào)用flip()方法,該方法將會(huì)完成兩件事情:
1. 把limit設(shè)置為當(dāng)前的position值?
2. 把position設(shè)置為0
由于position被設(shè)置為0,所以可以保證在下一步輸出時(shí)讀取到的是緩沖區(qū)中的第一個(gè)字節(jié),而limit被設(shè)置為當(dāng)前的position,可以保證讀取的數(shù)據(jù)正好是之前寫入到緩沖區(qū)中的數(shù)據(jù),如下圖所示:
?
現(xiàn)在調(diào)用get()方法從緩沖區(qū)中讀取數(shù)據(jù)寫入到輸出通道,這會(huì)導(dǎo)致position的增加而limit保持不變,但position不會(huì)超過limit的值,所以在讀取我們之前寫入到緩沖區(qū)中的4個(gè)自己之后,position和limit的值都為4,如下圖所示:
?
在從緩沖區(qū)中讀取數(shù)據(jù)完畢后,limit的值仍然保持在我們調(diào)用flip()方法時(shí)的值,調(diào)用clear()方法能夠把所有的狀態(tài)變化設(shè)置為初始化時(shí)的值,如下圖所示:
?
最后我們用一段代碼來驗(yàn)證這個(gè)過程,如下所示:
[java]?view plain?copy
?print?
完成的輸出結(jié)果為:
這與我們上面演示的過程一致。在后面的文章中,我們繼續(xù)介紹NIO中關(guān)于緩沖區(qū)一些更高級(jí)的使用。
(未完待續(xù))
轉(zhuǎn)載于:https://my.oschina.net/tantexian/blog/707865
總結(jié)
以上是生活随笔為你收集整理的Java NIO使用及原理分析(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript中函数参数以及函数中
- 下一篇: java美元兑换,(Java实现) 美元