重要字段
capacity:容量,最多容納多少個字節
limit: 0=<limit<=Capacity
position: 當前指針位置,從0向上增長。如果postion大於limit,Java會報出異常。
重要方法
get()獲取一個數據,並且,移動position
get(i) 獲取一個指定位置數據,但是,不移動position
remaining:還剩多少字節可以讀取。
flip:讓limit指向正確的位置。
compact:壓縮掉已經完成讀取的數據。
flip和compact是我之前不太容易理解的函數。
compact:讀取一段數據之後,調用campact,這時候position = limit,limit=capacity 可以繼續read(向buffer寫入數據)了。這可以保證寫入不會溢出,也不會覆蓋掉有用的數據。
flip:如果想要繼續讀取數據,需要調用一次flip,這樣limit = position,position = 0, 這可以保證讀取的正確性。
這就是flip和compact的用法。
更通俗點講:
compact壓縮空間並保證讀取正確性,compact+flip 壓縮空間並保證讀取正確性。單爲寫入準備,只調用compact即可。移動並繼續讀取,需要先調用compact進行壓縮,在通過flip方法,將position和limit設置到正確位置。
實例代碼:
public static void main( String [] args )
{
byte [] byte_array = new byte[10];
for( int i = 0;i<10; i++)
{
byte_array[i] = (byte)(i+1);
}
ByteBuffer bbufer = ByteBuffer.wrap(byte_array);
System.out.println(bbufer);
System.out.println("get for 3 times");
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println("---Compact---");
bbufer.compact();
System.out.println(bbufer);
bbufer.put((byte)(11));
bbufer.put((byte)(12));
System.out.println("---flip---");
bbufer.flip();
System.out.println(bbufer);
System.out.println("get for 3 times");
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println("---Compact---");
bbufer.compact();
System.out.println(bbufer);
System.out.println("---flip---");
bbufer.flip();
System.out.println(bbufer);
System.out.println("get for 6 times");
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println( bbufer.get());
System.out.println(bbufer);
System.out.println("remaining:"+bbufer.remaining());
System.out.println("---Compact---");
bbufer.compact();
System.out.println(bbufer);
System.out.println("---flip---");
bbufer.flip();
System.out.println(bbufer);
}