Java NIO 之 buffer

 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也一樣;

填充,通過put(byte),put(index,byte),按照絕對位置填充也是不改變當前position屬性

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  。

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.字節緩衝區

基本類型中,除了布爾類型,都實現了相應的緩衝區,字節緩衝區(ByteBuffer)可以說是最重要的緩衝區。它不光可以操作byte數據,還可以操作其它類型的數據。

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






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