limt-position的值!hasRemaining()則是判斷當(dāng)前是否有數(shù)據(jù),返回position < limit的boolean值!
ByteBuffer
緩沖區(qū)都有4個(gè)屬性:capacity、limit、position、mark,并遵循:mark <= position <= limit <= capacity,下表格是對(duì)著4個(gè)屬性的解釋:
屬性 描述Capacity | 容量,即可以容納的最大數(shù)據(jù)量;在緩沖區(qū)創(chuàng)建時(shí)被設(shè)定并且不能改變 |
Limit | 表示緩沖區(qū)的當(dāng)前終點(diǎn),不能對(duì)緩沖區(qū)超過(guò)極限的位置進(jìn)行讀寫操作。且極限是可以修改的 |
Position | 位置,下一個(gè)要被讀或?qū)懙脑氐乃饕看巫x寫緩沖區(qū)數(shù)據(jù)時(shí)都會(huì)改變改值,為下次讀寫作準(zhǔn)備 |
Mark | 標(biāo)記,調(diào)用mark()來(lái)設(shè)置mark=position,再調(diào)用reset()可以讓position恢復(fù)到標(biāo)記的位置 |
limit(), limit(10)等 | 其中讀取和設(shè)置這4個(gè)屬性的方法的命名和jQuery中的val(),val(10)類似,一個(gè)負(fù)責(zé)get,一個(gè)負(fù)責(zé)set |
reset() | 把position設(shè)置成mark的值,相當(dāng)于之前做過(guò)一個(gè)標(biāo)記,現(xiàn)在要退回到之前標(biāo)記的地方 |
clear() | position = 0;limit = capacity;mark = -1; 有點(diǎn)初始化的味道,但是并不影響底層byte數(shù)組的內(nèi)容 |
flip() | limit = position;position = 0;mark = -1; 翻轉(zhuǎn),也就是讓flip之后的position到limit這塊區(qū)域變成之前的0到position這塊,翻轉(zhuǎn)就是將一個(gè)處于存數(shù)據(jù)狀態(tài)的緩沖區(qū)變?yōu)橐粋€(gè)處于準(zhǔn)備取數(shù)據(jù)的狀態(tài) |
rewind() | 把position設(shè)為0,mark設(shè)為-1,不改變limit的值 |
remaining() | return limit - position;返回limit和position之間相對(duì)位置差 |
hasRemaining() | return position < limit返回是否還有未讀內(nèi)容 |
IoBuffer 是一個(gè)抽象類,所以它不能直接被實(shí)例化。分配IoBuffer,我們可以使用兩種allocate()方法。
Java代碼allocate()方法是用一個(gè)或兩個(gè)參數(shù)。第一種形式使用兩個(gè)參數(shù):
capacity - buffer的容量direct -buffer的類型。true 意味著得到一個(gè)direct buffer,false 意味著得到一個(gè)heap buffer
默認(rèn)的buffer分配是由SimpleBufferAllocator 處理的。
可選的, 下面的形式也可以使用:
Java代碼按照上面的例子,如果數(shù)據(jù)的長(zhǎng)度大于8byte的話,IoBuffe會(huì)根據(jù)情況重新分配其內(nèi)置的ByteBuffer,它的容量會(huì)被加倍,它的limit會(huì)增長(zhǎng)到String被寫入時(shí)的最后position。這種行為與StringBuffer工作的方式十分類似。
注意:這種程序結(jié)構(gòu)在MINA3.0時(shí)會(huì)被廢棄,因?yàn)檫@并不是增長(zhǎng)buffer容量的最好方式。這種方式很可能被一種類似InputStream的方式所替代,在InputStream的背后很可能是一組固定長(zhǎng)度的ByteBuffers。
為了節(jié)省內(nèi)存,在有些情形下我們需要釋放被額外分配的內(nèi)存,IoBuffer提供了autoShrink 屬性來(lái)達(dá)到此目的。如果autoShrink屬性被打開(kāi),當(dāng)compact()方法被調(diào)用時(shí),IoBuffer回將部分的回收其容量,只使用四分之一或是更少的容量。如果需要手動(dòng)控制收縮行為,請(qǐng)使用shrink()方法。
讓我們實(shí)踐一下:
Java代碼我們初始化分配一個(gè)容量為16的buffer,并將自動(dòng)收縮設(shè)置為true。
讓我們看一下輸出的結(jié)果:
Java代碼讓我們分析一下輸出:
初始化buffer的容量為16,因?yàn)槲覀兪褂?6指定了該buffer的容量,16也就成了該buffer的最小容量調(diào)用shrink()方法后,容量仍舊為16,所以無(wú)論怎么調(diào)用緊縮方法,容量都不好小于其初始容量增加該buffer的容量至32,該buffer的容量達(dá)到32調(diào)用 shrink()方法,容量回收至16,從而剔除了冗余的容量再次強(qiáng)調(diào),這種方式是一種默認(rèn)的行為,我們不需要明確指明一個(gè)buffer是否能被收縮。
IoBufferAllocater負(fù)責(zé)分配并管理buffer,如果你希望使用你的方式精確控制分配行為,請(qǐng)自己實(shí)現(xiàn)IoBufferAllocater 接口。
MINA提供了IoBufferAllocater的兩種實(shí)現(xiàn),如下:
SimpleBufferAllocator (默認(rèn)) - 每次創(chuàng)建一個(gè)新的bufferCachedBufferAllocator - 緩存buffer,使buffer在擴(kuò)展時(shí)可以被重用注意:在新版本的JVM中,使用cached IoBuffer并不能明顯提高性能。
你可以自己實(shí)現(xiàn)IoBufferAllocator接口并在IoBuffer上調(diào)用setAllocator()方法來(lái)指定使用你的實(shí)現(xiàn)。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注