国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

IoBuffer

2019-11-11 02:21:05
字體:
供稿:網(wǎng)友
Mina中傳輸?shù)乃卸M制信息都存放在IoBuffer中,IoBuffer是對java NIO中ByteBuffer的封裝(Mina2.0以前版本這個接口也是ByteBuffer),提供了更多操作二進制數(shù)據(jù),對象的方法,并且存儲空間可以自增長,用起來非常方便;簡單理解,它就是個可變長度的byte數(shù)組! IoBuffer常用方法: 1. static IoBuffer allocate(int capacity,boolean useDirectBuffer) 創(chuàng)建IoBuffer實例,第一個參數(shù)指定初始化容量,第二個參數(shù)指定使用直接緩沖區(qū)還是Java 內(nèi)存堆的緩存區(qū),默認為false。 2.IoBuffer setAutoExpand(boolean autoExpand) 這個方法設(shè)置IoBuffer 為自動擴展容量,也就是前面所說的長度可變,那么可以看出長度可變這個特性默認是不開啟的。 3. IoBuffer flip() limit=position , position=0,重置mask,為了讀取做好準備,一般是結(jié)束buf操作,將buf寫入輸出流時調(diào)用;這個必須要調(diào)用,否則極有可能 position!=limit,導(dǎo)致position后面沒有數(shù)據(jù);每次寫入數(shù)據(jù)到輸出流時,必須確保position=limit。 4. IoBuffer clear()與IoBuffer reset() clear:limit=capacity , position=0,重置mark;它是不清空數(shù)據(jù),但從頭開始存放數(shù)據(jù)做準備—相當(dāng)于覆蓋老數(shù)據(jù)。 reset就是清空數(shù)據(jù) 5. int remaining()與boolean hasRemaining() 這兩個方法一般是在調(diào)用了flip()后使用的,remaining()是返回 

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 操作

分配一個新的Buffer

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。

 

創(chuàng)建自動收縮的Buffer

為了節(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是否能被收縮。

 

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)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 平利县| 神池县| 昂仁县| 陵川县| 通河县| 尚义县| 左云县| 黄浦区| 从化市| 聂荣县| 贵定县| 石家庄市| 奉贤区| 金溪县| 万州区| 郁南县| 淮滨县| 阜阳市| 阿尔山市| 嘉黎县| 同江市| 林周县| 达拉特旗| 仙居县| 通许县| 彭水| 虹口区| 乌拉特后旗| 曲阜市| 朝阳县| 西青区| 玛沁县| 连山| 通江县| 永川市| 石河子市| 尼木县| 临沭县| 衡南县| 隆子县| 武定县|