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