java NIO 之Buffer類

1.基礎

緩衝區是包在一個對象內的基本數據元素數組。
在這裏插入圖片描述

1.1 關鍵詞

容量(Capacity)

緩衝區能夠容納的數據元素的最大數量。這一容量在緩衝區創建時被設定,並且永遠不能 被改變。

上界(Limit)

緩衝區的第一個不能被讀或寫的元素。或者說,緩衝區中現存元素的計數。

位置(Position)

下一個要被讀或寫的元素的索引。位置會自動由相應的 get( )和 put( )函數更新。

標記(Mark)

一個備忘位置。調用mark( )來設定mark=postion。調用reset( )設定position= mark。標記在設定前是未定義的(undefined)。

  • 新建的buffer(容量爲10)
    位置被設爲 0,mark 爲空,而且容量和上界被設爲 10,剛好經過緩衝區能夠容納的最後一個字節。 標記最初未定義。容量是固定的,但另外的三個屬性可以在使用緩衝區時改變。
    在這裏插入圖片描述

1.2 通用API

package java.nio;
public abstract class Buffer {
public final int capacity( )
public final int position( )
public final Buffer position (int newPositio public final int limit( )
public final Buffer limit (int newLimit) public final Buffer mark( )
public final Buffer reset( )
public final Buffer clear( )
public final Buffer flip( )
public final Buffer rewind( )
public final int remaining( )
public final boolean hasRemaining( ) public abstract boolean isReadOnly( );
}

1.3 數據存取

通常來講,buffer通過get來讀取數據,通過put來寫入數據。但是無論使用put還是get操作,都會使position增加。所以buffer在不進行flip操作的情況下,不能又讀又存。此外,如果使用類似:public abstract ByteBuffer put (int index, byte b)public abstract byte get (int index)這樣帶位置參數的方法存取數據將不會修改position屬性。

例如:

  1. 開始時,position = 5
    在這裏插入圖片描述
  2. 調用 buffer.put(0,(byte)'M').put((byte)'w')後,position = 6.說明put(0,(byte)‘M’)並沒有改變position的位置。
    在這裏插入圖片描述

1.4 flip()操作

該操作的作用是將buffer有填充狀態變爲待讀取狀態
通道從buffer中讀取數據需要知道數據的起止點和終點。需要通過flip()方法,將limit指向position,同時將position指向0
在這裏插入圖片描述
在這裏插入圖片描述

1.5 hasRemaining()操作

該操作的作用是釋放緩衝區時告訴您是否已經達到緩衝區的上界。

// 示例1
for (int i = 0; buffer.hasRemaining( ), i++) {
myByteArray [i] = buffer.get( ); 
}

// 示例2
int count = buffer.remaining( );
for (int i = 0; i < count, i++) {
	myByteArray [i] = buffer.get( ); 
}

1.6 conpat()壓縮操作

將從position位置開始往後的數據往前覆蓋。position會移到末尾。他的作用是移除已經使用的數據
在這裏插入圖片描述
在這裏插入圖片描述
當使用compact之後,如果繼續使用put的操作,會覆蓋position之後的數據。

1.7 緩存區比較

equals

  1. buffer的類型要相同,例如都是byteBuffer
  2. limit 到capacity的距離要相同
  3. 從position到limit之間的序列要相同

2. 緩衝區創建

        // 示例1
        ByteBuffer byteBuffer0 = ByteBuffer.allocate(10);

        // 示例2
        byte[] bytes = new byte[1024];

        ByteBuffer byteBuffer1 = ByteBuffer.wrap(bytes);
        
        // its position will be offset,its limit will be offset + length
        ByteBuffer byteBuffer2 = ByteBuffer.wrap(bytes, 0, 1);

3. 直接緩衝區和非直接緩衝區

直接緩衝區:將緩衝區建立在物理內存中
非直接緩衝區:將緩衝區建立在內存中

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章