Buffer(緩衝區)是一個包裝了基本數據元素數組的對象,提供了比數組更加豐富API操作數據。
1.屬性
Buffer有四個基本屬性:
1、capacity 容量,buffer能夠容納的最大元素數目,在Buffer創建時設定並不能更改
2、limit buffer中有效位置數目
3、position 下一個讀或者寫的位置
4、mark 用於記憶的標誌位,配合reset()使用,初始值未設定,調用mark()方法後將當前position設爲mark的值
四者關係:0 <= mark <= position <= limit <= capacity
2.基本操作
1
訪問,通過get(),get(index),其中get()從當前position位置讀取,get(index)從index位置讀取,不改變當前position,下面要說到的put也一樣;
2 填充,通過put(byte),put(index,byte),按照絕對位置填充也是不改變當前position屬性
3 flip ,通過buffer.flip() 設置limit=postion,postion=0。因爲向緩衝區put數據之後,會導致postion和limit的改變,爲了使能讀取buffer的所有數據,一般在讀取之前,調用flip()函數。
4 判斷數據:buff.remaining(); 返回剩餘的數據數量。buff.hasRemaining();是否有數據。
5 clear:buff.clear() ,將緩衝區設置成初始狀態。postion=0,limit=capacity 。
6 compact()方法,用於壓縮buffer,這個方法在多次重複調用時是比較低效。把當前讀寫位置之後的數據複製到內部存儲空間的最前面。同時,讀寫位置postion=數據的大小。在緩衝區數據沒有讀取完全,又需要插入數據時使用。
ByteBuffer buffer = ByteBuffer.allocate(32);
buffer.put(new byte[16]);
buffer.flip();
System.out.println("filp 後 limit:" + buffer.limit());//limit=16
buffer.getInt();//
System.out.println("get int 後postion:" + buffer.position());//postion=4
buffer.compact();
System.out.println("compact 後 postion:" + buffer.position());//postion=12
7
mark(),初始是未定義的,這適合如果調用reset將拋出InvalidMarkException。調用mark()後,將當前position設爲mark以便reset時返回。注意,rewind( ), clear( ), and flip( )方法都將丟棄已經創建的mark。調用limit(index),position(index),如果index的值小於當前mark,mark也將被丟棄。
3.字節緩衝區
public static void useByteBuffer(){
ByteBuffer buffer = ByteBuffer.allocate(32);
//buffer.order(ByteOrder.BIG_ENDIAN);
buffer.put((byte)1);
buffer.put(new byte[3]);
buffer.putChar('A');
System.out.println(buffer.position());//char 佔2個byte,postion=6
buffer.putFloat(1.222f);//postion=10
buffer.putLong(100L);
System.out.println(buffer.get(0));
System.out.println(buffer.getChar(4));
System.out.println(buffer.getFloat(6));
System.out.println(buffer.getLong(10));;
}
用ByteBuffer存取其它基本類型,需要自己計算位置,位置錯了,讀取的數據也會出錯。
字節順尋,使用ByteBuffer存取其它基本類型數據,比如char,需要兩個字節,所以要考慮字節順序。默認使用的是大端順序:ByteOrder.BIG_ENDIAN.
ByteBuffer可以轉換成其它(CharBuffer,IntBuffer,FloatBuffer,LongBuffer 等)視圖。
轉換成新的視圖後,共享的空間是從當前讀寫位置到讀寫限制的空間。
ByteBuffer buffer = ByteBuffer.allocate(32);
buffer.putInt(1); //postion=4
IntBuffer intBuffer = buffer.asIntBuffer();//共享空間 位置:4-31
intBuffer.put(4);
intBuffer.flip();
System.out.println(intBuffer.get());//4
System.out.println(buffer.getInt());//4