ByteBuffer是NIO中用的最多的緩存,ByteBuffer是一個抽象類,HeapByteBuffer 繼承了ByteBuffer,DirectByteBuffer繼承抽象類MappedByteBuffer,抽象類MappedByteBuffer繼承了ByteBufferjava
DirectByteBuffer 使用Native函數直接分配堆外內存,而後對一個存儲在Java 堆裏面的該對象做爲這塊內存的引用操做,這樣在一些地方顯著提升了性能,避免了Java堆和Native堆中來回的複製 。因爲他是使用unsafe進行堆外實現,因此咱們這裏只說一下HeapByteBuffer 的實現。數組
mark:標誌位,對當前position作標誌。緩存
position:從哪一個位置開始讀寫元素,每次讀或者寫position+1app
limit:表示緩存中實際存了多少元素,當limit和position相等時表示緩存中數據滿了或者空了。函數
capacity:緩存區的容量,在ByteBuffer建立的時候定好的而且不能修改。 ByteBuffer.allocate(128);則capacity = 128。post
建立緩衝區:其實就是在堆內存中建立一個byte[]數組性能
HeapByteBuffer 調用父類的方法 super(mark,post,lim,cap)spa
若是cap容量小於零拋出異常,反之設置容量值,lim值,pos值 分別調用limit(lim)和position(pos)方法3d
初始化limit的值。若是limit的值>緩存容量或者limit的值小於0就拋出異常,不然設置limit的值,若是position>limit則將position的值設置爲limit,若是mark的值大於limit將limit的值設置爲初始值-1.對象
初始化position的值 就不詳細說了,看就能看懂的吧
clear()方法 不會把它裏的內容清除,只是重置了position ,limit,mark 的值
在每次寫完數據準備讀的時候都會調用該方法,意思就是將一個處於存數據狀態的緩衝區變爲一個處於準備取數據的
本身的理解:在存數據的時候postion指向的都是要存的下一個地址,該地址是一個空的;而在取數據的時候postion指向的是下一個要讀取的地址,該地址是有值的。
public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocate(3);//[pos=2 lim=3 cap=3] byteBuffer.put((byte) 1);//[pos=1 lim=3 cap=3] byteBuffer.put((byte) 2);//[pos=2 lim=3 cap=3] System.out.println(byteBuffer); System.out.println(byteBuffer.remaining() + "************"); System.out.println(byteBuffer.get() + ":111111111111111");//取的是pos=2位置的元素,該位置沒有元素。取完以後把pos+1 System.out.println(byteBuffer);//[pos=3 lim=3 cap=3] System.out.println(byteBuffer.remaining()); byteBuffer.put(2, (byte) 3); System.out.println(byteBuffer); }
結果是:
java.nio.HeapByteBuffer[pos=2 lim=3 cap=3]
1************
0:111111111111111
java.nio.HeapByteBuffer[pos=3 lim=3 cap=3]
0
java.nio.HeapByteBuffer[pos=3 lim=3 cap=3]
壓縮緩衝區 compact()
public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocate(10);//[pos=2 lim=3 cap=3] byteBuffer.put((byte) 1);//[pos=1 lim=3 cap=3] byteBuffer.put((byte) 2); byteBuffer.put((byte) 3); byteBuffer.put((byte) 4); System.out.println(byteBuffer); System.out.println(byteBuffer.remaining()); byteBuffer.compact(); System.out.println(byteBuffer);
結果是:
java.nio.HeapByteBuffer[pos=4 lim=10 cap=10] 6 java.nio.HeapByteBuffer[pos=6 lim=10 cap=10]