日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于ByteBuffer使用解释

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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
-10123456789?
?HELLOWORLD?
當我們連續調用兩次get()方法獲得兩個個字節,每次調用都會觸發position++操作,那么此時position就會移動到index = 2的的地方,而這個時候Limit和mark是不會發生變化的。如果將讀取的兩個字節打印會是H和E,因此執行結果第二行會有position:2? limit:10結果.
???m、p???????L
-10123456789?
?HELLOWORLD?
讀取完畢后我們使用mark,這個時候mark會從-1移動到2和position指向同一個元素,可以看見Limit是不會發生改變的。
mp?L????????
-10123456789?
?HELLOWORLD?
使用了mark標記的當前的position后,如果們調用flip,這個時候Limit就會指向position的位置,并將mark和position還原為初始值。這樣就知道了limit當前的就為2,什么意思呢?就是說當前可以讀的字節數是2。我們可以嘗試一下如下代碼:System.out.println((char)buff.get()+""+(char)buff.get()); 輸出結果:he貌似這也沒什么稀奇的,如果你在代碼換成// System.out.println((char)buff.get()+""+(char)buff.get() System.out.println((char)buff.get()+""+(char)buff.get()+""+(char)buff.get()); 輸出結果:limit:10??
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使用解释的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。