NIO學習-Buffer

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 決定

相關文章
相關標籤/搜索