欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

關于ByteBuffer使用解釋

系統 1623 0

之前看過相關的ByteBuffer的使用,但是問題是那時還年輕,所以現在有點老了,因此,忘記了,所以決心看源代碼了解一番----故作此篇文章。

?

查看ByteBuffer的API,看的我是一頭霧水,搞不清什么mark、position、limit、flip、reset幾個的用法,先看下面的例子:

Java代碼 ? ? 收藏代碼
  1. ?????String?str?=? "helloWorld" ;??
  2. ????????ByteBuffer?buff??=?ByteBuffer.wrap(str.getBytes());??
  3. ????????System.out.println( "position:" +buff.position()+ "\t?limit:" +buff.limit());??
  4. ???????? //讀取兩個字節 ??
  5. ????????buff.get();??
  6. ????????buff.get();??
  7. ????????System.out.println( "position:" +?buff.get(buff.position())+ "\t?limit:" +buff.limit());??
  8. ????????buff.mark();??
  9. ????????System.out.println( "position:" +buff.position()+ "\t?limit:" +buff.limit());??
  10. ????????buff.flip();??
  11. ????????System.out.println( "position:" +buff.position()+ "\t?limit:" +buff.limit());<span?style= "white-space:?pre;" >????</span>??
Java代碼 ? ? 收藏代碼
  1. <pre?name= "code" ? class = "java" >輸出結果:??
  2. position: 0 ??limit: 10 ??
  3. position: 2 ??limit: 10 ??
  4. position: 2 ??limit: 10 ??
  5. position: 0 ??limit: 2 ??
  6. </pre>??
  7. ???
??我們以每位開發人員熟悉的”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 ?
?? 當我們連續調用兩次get()方法獲得兩個個字節,每次調用都會觸發position++操作,那么此時position就會移動到index = 2的的地方,而這個時候Limit和mark是不會發生變化的。如果將讀取的兩個字節打印會是H和E,因此執行結果第二行會有 position:2? limit:10結果.
? ? ? m、p ? ? ? ? ? ? ? L
-1 0 1 2 3 4 5 6 7 8 9 ?
? H E L L O W O R L D ?
???? 讀取完畢后我們使用mark,這個時候mark會從-1移動到2和position指向同一個元素,可以看見Limit是不會發生改變的。
m p ? L ? ? ? ? ? ? ? ?
-1 0 1 2 3 4 5 6 7 8 9 ?
? H E L L O W O R L D ?
??? 使用了mark標記的當前的position后,如果們調用flip,這個時候Limit就會指向position的位置,并將mark和position還原為初始值。這樣就知道了limit當前的就為2,什么意思呢?就是說當前可以讀的字節數是2。
我們可以嘗試一下如下代碼:
?
Java代碼 ? ? 收藏代碼
  1. System.out.println(( char )buff.get()+ "" +( char )buff.get());??
?? ?輸出結果:he
??? 貌似這也沒什么稀奇的,如果你在代碼換成
?
Java代碼 ? ? 收藏代碼
  1. //?System.out.println((char)buff.get()+""+(char)buff.get() ??
  2. ???System.out.println(( char )buff.get()+ "" +( char )buff.get()+ "" +( char )buff.get());??
Java代碼 ? ? 收藏代碼
  1. 輸出結果:<pre?name= "code" ? class = "java" >position: 0 ????limit: 10 ??
  2. Exception?in?thread? "main" ?java.nio.BufferUnderflowException??
  3. ????at?java.nio.Buffer.nextGetIndex(Buffer.java: 474 )??
  4. ????at?java.nio.HeapByteBuffer.get(HeapByteBuffer.java: 117 )??
  5. ????at?com.taobao.moxing.notify.Main.main(Main.java: 33 )position: 2 ????limit: 10 ??
  6. position: 2 ???limit: 10 ??
  7. position: 0 ???limit: 2 ??
  8. </pre>??
?? 為什么會拋異常呢?原因是limit的含義就想一個窗口,你當前能讀到的數據就是當前窗口限制的(本例中即為2),如果這個窗口之外的所有元素都是不可讀的。至此我想你和我就應該明白這幾個參數的含義了吧。
??? 而至于reset方法,它是將當前的position設置為0,
???? rewind是將mark重置為-1,position重置為0;
???? clear方法是真正的重置,將mark=-1,position=0,limit=capacity(即當前buffer的容量)

關于ByteBuffer使用解釋


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人免费在线视频观看 | 国产麻豆一区二区三区 | 亚洲视频在线观看一区 | 亚洲国产成人va在线观看网址 | 免费又粗又硬进去好爽A片视频 | 亚洲免费精品 | 国产一级淫| 日韩中文字幕不卡 | 三A级做爰片免费观看国产电影 | 开心久久网 | 中文线码中文高清播放中 | 国产成人啪精品视频免费网站软件 | 91在线观看| 人人艹逼| 欧美一区二区三区视频 | 国产午夜三级一区二区三桃花影视 | 亚洲9777精品毛A片久久久 | jzzjlzz亚洲乱熟在线播放 | 中文字幕视频在线观看 | 5g免费影院永久天天影院在线 | 奇米影视在线 | 91视频观看 | 国产一级视频 | 久久九九精品一区二区 | 欧美日韩一区二区三区免费视频 | 国产亚洲精品高清在线 | 青娱乐在线视频盛宴 | 尤物网站永久在线观看 | 国产中文字幕在线观看 | 亚洲一区二区三区在线免费观看 | 国产精品日本无码久久一 | 日韩一区不卡 | 亚洲一区二区综合 | 国产欧美久久一区二区三区 | 超碰97免费观看 | 精品午夜寂寞黄网站在线 | 成人黄色免费 | 日韩av福利| 亚洲视频在线看 | 一级片网址 | 男女交配视频网站 |