buffer 是在通道中傳輸數據的媒介,根據數據類型的不一樣,分爲ByteBuffer\CharBuffer\DoubleBuffer...等。根據緩存區的位置又分爲 【直接緩存區\物理緩存區】與【非直接緩存區\jvm緩存區】java
下面是buffer的主要屬性緩存
1. capacity 是這個buffer最大的存儲容量。在建立時指定,且不能改變jvm
ByteBuffer buffer = ByteBuffer.allocate(1024);//capacity 值爲1024。將不會再變
2.position 位置,表示緩衝區中正在操做數據的位置post
ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("abc".getBytes()); //往當前buffer填充3個字節的空間 System.out.println(buffer.position()); // 輸出:3,同時也告知你下個要操做的位置是3
3. limit 界限,表示緩衝區中能夠操做數據的大小(limit 後數據不能進行讀寫)code
buffer.flip(); //測定當前有效數據的位置 System.out.println(buffer.limit()); //輸出:3,告知在該buffer有效數據策長度是3.後面數據爲空(不可操做)
*當buffer沒有執行flip()方法時,limt的值都和capacity 同樣。這樣讀取的對方,他是不知道buffer裏面到到底有多少空間是有值的。這也是limt屬性的職責所在。
* 當調用flip()方法時,也意味着你進行一「讀模式」。那麼position的值將變成0,也就是是你讀取的當前位置在0ip
4.對buffer進行讀取ci
byte[] bytes = new byte[2]; buffer.get(bytes); //讀取了2個字節,那麼下次讀取的位置在2 System.out.println(buffer.position()); // 輸出:2
buffer.rewind(); //重置讀取的狀態,即position=0 buffer.clear(); //清空緩衝區,即設置position=0,limit=capacity
* clear()方法表示清空,但實際上buffer只是改變了它的標記位置。實際的內容是存在的rem
5. mark 標記,表示當前position的位置,可能經過reset()恢復到mrak的位置get
byte[] bytes = new byte[1]; buffer.get(bytes); //讀取了1個字節,當前position = 1 buffer.mark(); //標記了當前位置在1,mark = 1 buffer.position(3); //手動設置postion = 3 System.out.println(buffer.position()); //輸出:3 buffer.reset(); //回到mark所標記的位置 System.out.println(buffer.position()); //輸出:1
6. 查詢緩衝區是否還有可操做的空間,及剩餘可操做空間的大小it
ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("abc".getBytes()); buffer.hasRemaining(); //還能夠再填充數據(還可操做) buffer.remaining() //1021 可操做的空間大小爲:1021
*當buffer處在讀模式的時,buffer可操做空間的最大值由limt決定。而在寫模式時,buffer可操做空間的最大值由capacity 決定