关于ByteBuffer使用解释
生活随笔
收集整理的這篇文章主要介紹了
关于ByteBuffer使用解释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自??關于ByteBuffer使用解釋
之前看過相關的ByteBuffer的使用,但是問題是那時還年輕,所以現在有點老了,因此,忘記了,所以決心看源代碼了解一番----故作此篇文章。
?
查看ByteBuffer的API,看的我是一頭霧水,搞不清什么mark、position、limit、flip、reset幾個的用法,先看下面的例子:
????String str = "helloWorld"; ByteBuffer buff = ByteBuffer.wrap(str.getBytes()); System.out.println("position:"+buff.position()+"\t limit:"+buff.limit()); //讀取兩個字節 buff.get(); buff.get(); System.out.println("position:"+ buff.get(buff.position())+"\t limit:"+buff.limit()); buff.mark(); System.out.println("position:"+buff.position()+"\t limit:"+buff.limit()); buff.flip(); System.out.println("position:"+buff.position()+"\t limit:"+buff.limit()); 輸出結果:?position:0? limit:10??position:2? limit:10??position:2? limit:10??position:0? limit:2?? 我們以每位開發人員熟悉的”helloworld“,用ByteBuffer將字符串包裝,由于ByteBuffer是一個抽象類,通過wrap包裝的對象將實際返回的是一個HeapByteBuffer對象。由此可知HeapByteBuffer是ByteBuffer的子類,同樣的ByteBuffer又是Buffer抽象類的子類。以上提到的mark、position、limit、flip、reset都是出自于Buffer這個抽象類。下面我們來解析幾個方法的,當我們調用了wrap方法后Buffer中初始化的結構是:注釋:m:mark;p:position;L:limit;
初始情況下mark是指向第一個元素之前的的即-1,postion為指向第一個元素為0.而Limit是被賦值為byte[]的長度。因此這就是打印結果的第一行。
| m | ? | ? | p | ? | ? | ? | ? | ? | ? | ? | L |
| -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| ? | H | E | L | L | O | W | O | R | L | D | ? |
| ? | ? | ? | m、p | ? | ? | ? | ? | ? | ? | ? | L |
| -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| ? | H | E | L | L | O | W | O | R | L | D | ? |
| m | p | ? | L | ? | ? | ? | ? | ? | ? | ? | ? |
| -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
| ? | H | E | L | L | O | W | O | R | L | D | ? |
Exception in thread "main" java.nio.BufferUnderflowException??
? ? at java.nio.Buffer.nextGetIndex(Buffer.java:474)??
? ? at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:117)??
? ? at com.taobao.moxing.notify.Main.main(Main.java:33)position:2? ? limit:10??
position:2? ?limit:10??
position:0? ?limit:2??
?? 為什么會拋異常呢?原因是limit的含義就想一個窗口,你當前能讀到的數據就是當前窗口限制的(本例中即為2),如果這個窗口之外的所有元素都是不可讀的。至此我想你和我就應該明白這幾個參數的含義了吧。而至于reset方法,它是將當前的position設置為0,rewind是將mark重置為-1,position重置為0;clear方法是真正的重置,將mark=-1,position=0,limit=capacity(即當前buffer的容量)
總結
以上是生活随笔為你收集整理的关于ByteBuffer使用解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《王者荣耀》9月全球吸金1.98亿美元
- 下一篇: 学习笔记之ByteBuffer使用和实现