java nio Buffer

? ? ? ? ?偶然在網(wǎng)上瀏覽到這樣的一些字眼“寫一個(gè)自己的RPC框架”,心中也很激憤。于是乎想從頭開始,深入研究一下如何搭建一個(gè)RPC框架。筆者是做java的,市面上開源的RPC框架很是不少,Dubbo、Thrift等等。我規(guī)劃了一下自己的算是學(xué)習(xí)路線。線程->nio->netty->RPC->RPC產(chǎn)品。線程相關(guān)的知識(shí)筆者自認(rèn)為還算可以。那么就從nio開始,很多人認(rèn)為應(yīng)該先從“同步”“異步”“阻塞”“非阻塞”幾個(gè)概念開始,但是這些網(wǎng)上解釋的已經(jīng)很是透徹,就從nio涉及的幾大成員開始吧,第一站:Buffer。


一 、Buffer

?一種byte數(shù)組類型的存儲(chǔ)結(jié)果。

抽象類

非線程安全

具有6個(gè)屬性,其中

mark:標(biāo)示位,默認(rèn)為-1。一般配合mark和reset一起用,下面再說。

position:默認(rèn)為0,表示當(dāng)前可操作元素的位置。

limit:數(shù)據(jù)指針可到達(dá)的最大位置。

capacity:總?cè)萘?/p>

address:直接內(nèi)存buffer中會(huì)用到,之后說。

屬性值之間的關(guān)系 :mark <= position <= limit <= capacity

方法

均有獲取以上屬性值 帶參和不帶參的方法,不帶參為獲取當(dāng)前數(shù)組中的值,帶參則是指定值。

mark(): 將當(dāng)前的mark值設(shè)置為position的值。

reset(): 將position的值設(shè)置為當(dāng)前mark的值。

clear():初始化所有屬性值為默認(rèn)值。

flip():limit的值設(shè)置為position的值,其他屬性值設(shè)置為默認(rèn)的值。

rewind():讀/寫到buffer中數(shù)據(jù),然后調(diào)用rewind 從來再開始。position=0 mark=-1.

remaining():剩余可操作容量 limit-position

hasRemaining():是否還有剩余?limit-position>0?

isReadOnly():

isDirect():

nextGetIndex() 帶參(返回position+int參數(shù)的位置)和不帶參(返回當(dāng)前position的位置)兩種。

checkIndex(int i) 檢測給定的值i 是否在可操作范圍內(nèi)。

discardMark() 將mark屬性值設(shè)置為默認(rèn)值 也就是-1

truncate()? mark=-1 其他值為0

buffer類及其子類的所有操作方法 都僅僅是操作幾個(gè)屬性的值? 對(duì)里面的元素沒有任何操作,簡單的說,只是指針的變化,但是元素沒有任何變動(dòng)。我沒有列出源碼,我相信所有人的機(jī)器上都會(huì)有的。

二、HeapByteBuffer& HeapByteBufferR

堆內(nèi)內(nèi)存,jvm堆內(nèi)內(nèi)存,垃圾回收由jvm來控制。

ByteBuffer.allocate(int) 分配內(nèi)存。

方法

slice(): 構(gòu)造一個(gè)與源buffer共享元素的buffer ,mark=-1,position=0,limit=capacity=源buffer的remaining也就是剩余長度,offset=position+offset。也就是說,如果是正常遍歷而改動(dòng)的數(shù)據(jù)指針屬性值的話,這個(gè)操作是將所有remaining的位置構(gòu)成一個(gè)新的共享同一些元素的buffer。

duplicate():復(fù)制一份源buffer 構(gòu)成一個(gè)新buffer,共享元素。

asReadOnlyBuffer() 復(fù)制一份源buffer,構(gòu)成一個(gè)只讀buffer(HeapByteBufferR.class)

ix(int i): 相對(duì)offset 第i個(gè)元素。 offset默認(rèn)為0;

get() = hb[ix(nextGetIndex())] 獲取當(dāng)前相對(duì)offset位置第 position的元素。

get(i) 獲取指定位置的元素,首先i需要在可操作元素的下標(biāo)范圍內(nèi)。

get(byte[] arg,offset,length) 將buffer中的元素,copy到arg中。

put(byte[] arg,offset,length) 將arg中的元素,copy到buffer中。

compact():從當(dāng)前position位置開始向后取remaining()長度的元素,放到buffer 從position=0開始的位置。置換完成之后,position=remaining() mark=-1

HeapByteBufferR只讀buffer,重寫了所有寫操作,均會(huì)拋出異常,通過buffer.asReadOnlyBuffer()來構(gòu)建。

關(guān)于方法使用的具體業(yè)務(wù)場景,現(xiàn)在能寫出來的都是個(gè)人猜測,所以我想在接下來的測試中補(bǔ)全。

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

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

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