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
屬性。
例如:
- 開始時,position = 5
- 調用
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
- buffer的類型要相同,例如都是byteBuffer
- limit 到capacity的距離要相同
- 從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. 直接緩衝區和非直接緩衝區
直接緩衝區:將緩衝區建立在物理內存中
非直接緩衝區:將緩衝區建立在內存中