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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

IoBuffer

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

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è)新的Buffer

IoBuffer 是一個(gè)抽象類,所以它不能直接被實(shí)例化。分配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()方法是用一個(gè)或兩個(gè)參數(shù)。第一種形式使用兩個(gè)參數(shù):

capacity - buffer的容量direct -buffer的類型。true 意味著得到一個(gè)direct buffer,false 意味著得到一個(gè)heap buffer

 

默認(rèn)的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ù)的長(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。

 

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

為了節(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代碼  收藏代碼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());  

 我們初始化分配一個(gè)容量為16的buffer,并將自動(dòng)收縮設(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,因?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是否能被收縮。

 

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴安盟| 巢湖市| 卫辉市| 黑水县| 白水县| 西乌珠穆沁旗| 客服| 裕民县| 易门县| 娄底市| 岗巴县| 平谷区| 荃湾区| 灵山县| 南平市| 唐山市| 德保县| 磐石市| 洛宁县| 丘北县| 奉化市| 封丘县| 芜湖县| 仁化县| 车险| 麟游县| 分宜县| 蓝山县| 石林| 博客| 北宁市| 明星| 盈江县| 内江市| 曲松县| 土默特左旗| 河北省| 临夏县| 巴楚县| 石泉县| 大埔县|