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