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

首頁 > 學院 > 開發設計 > 正文

IoBuffer

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

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

分配一個新的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()方法是用一個或兩個參數。第一種形式使用兩個參數:

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

 按照上面的例子,如果數據的長度大于8byte的話,IoBuffe會根據情況重新分配其內置的ByteBuffer,它的容量會被加倍,它的limit會增長到String被寫入時的最后position。這種行為與StringBuffer工作的方式十分類似。

注意:這種程序結構在MINA3.0時會被廢棄,因為這并不是增長buffer容量的最好方式。這種方式很可能被一種類似InputStream的方式所替代,在InputStream的背后很可能是一組固定長度的ByteBuffers。

 

創建自動收縮的Buffer

為了節省內存,在有些情形下我們需要釋放被額外分配的內存,IoBuffer提供了autoShrink 屬性來達到此目的。如果autoShrink屬性被打開,當compact()方法被調用時,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,并將自動收縮設置為true。

讓我們看一下輸出的結果:

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的最小容量調用shrink()方法后,容量仍舊為16,所以無論怎么調用緊縮方法,容量都不好小于其初始容量增加該buffer的容量至32,該buffer的容量達到32調用 shrink()方法,容量回收至16,從而剔除了冗余的容量

再次強調,這種方式是一種默認的行為,我們不需要明確指明一個buffer是否能被收縮。

 

Buffer分配

IoBufferAllocater負責分配并管理buffer,如果你希望使用你的方式精確控制分配行為,請自己實現IoBufferAllocater 接口。

MINA提供了IoBufferAllocater的兩種實現,如下:

SimpleBufferAllocator (默認) - 每次創建一個新的bufferCachedBufferAllocator - 緩存buffer,使buffer在擴展時可以被重用

注意:在新版本的JVM中,使用cached IoBuffer并不能明顯提高性能。

你可以自己實現IoBufferAllocator接口并在IoBuffer上調用setAllocator()方法來指定使用你的實現。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石景山区| 大关县| 瑞丽市| 遵化市| 呈贡县| 桐柏县| 山东| 绥德县| 周宁县| 五家渠市| 东方市| 浦北县| 比如县| 天全县| 隆子县| 安溪县| 郓城县| 平乡县| 青铜峡市| 杭锦后旗| 深州市| 平和县| 马山县| 高邑县| 尤溪县| 菏泽市| 临泉县| 邻水| 龙州县| 紫金县| 长葛市| 石门县| 广元市| 香港| 宣化县| 东海县| 定襄县| 上犹县| 云南省| 金堂县| 湟中县|