日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

關(guān)于ByteBuffer使用解釋

系統(tǒng) 1712 0

之前看過(guò)相關(guān)的ByteBuffer的使用,但是問(wèn)題是那時(shí)還年輕,所以現(xiàn)在有點(diǎn)老了,因此,忘記了,所以決心看源代碼了解一番----故作此篇文章。

?

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

Java代碼 ? ? 收藏代碼
  1. ?????String?str?=? "helloWorld" ;??
  2. ????????ByteBuffer?buff??=?ByteBuffer.wrap(str.getBytes());??
  3. ????????System.out.println( "position:" +buff.position()+ "\t?limit:" +buff.limit());??
  4. ???????? //讀取兩個(gè)字節(jié) ??
  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" >輸出結(jié)果:??
  2. position: 0 ??limit: 10 ??
  3. position: 2 ??limit: 10 ??
  4. position: 2 ??limit: 10 ??
  5. position: 0 ??limit: 2 ??
  6. </pre>??
  7. ???
??我們以每位開(kāi)發(fā)人員熟悉的”helloworld“,用ByteBuffer將字符串包裝,由于ByteBuffer是一個(gè)抽象類(lèi),通過(guò)wrap包裝的對(duì)象將實(shí)際返回的是一個(gè)HeapByteBuffer對(duì)象。由此可知HeapByteBuffer是ByteBuffer的子類(lèi),同樣的ByteBuffer又是Buffer抽象類(lèi)的子類(lèi)。以上提到的mark、position、limit、flip、reset都是出自于Buffer這個(gè)抽象類(lèi)。
下面我們來(lái)解析幾個(gè)方法的,當(dāng)我們調(diào)用了wrap方法后Buffer中初始化的結(jié)構(gòu)是:
注釋?zhuān)?
m:mark;
p:position;
L:limit;
?
???初始情況下mark是指向第一個(gè)元素之前的的即-1,postion為指向第一個(gè)元素為0.而Limit是被賦值為byte[]的長(zhǎng)度。
因此這就是打印結(jié)果的第一行。
m ? ? p ? ? ? ? ? ? ? L
-1 0 1 2 3 4 5 6 7 8 9 ?
? H E L L O W O R L D ?
?? 當(dāng)我們連續(xù)調(diào)用兩次get()方法獲得兩個(gè)個(gè)字節(jié),每次調(diào)用都會(huì)觸發(fā)position++操作,那么此時(shí)position就會(huì)移動(dòng)到index = 2的的地方,而這個(gè)時(shí)候Limit和mark是不會(huì)發(fā)生變化的。如果將讀取的兩個(gè)字節(jié)打印會(huì)是H和E,因此執(zhí)行結(jié)果第二行會(huì)有 position:2? limit:10結(jié)果.
? ? ? 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,這個(gè)時(shí)候mark會(huì)從-1移動(dòng)到2和position指向同一個(gè)元素,可以看見(jiàn)Limit是不會(huì)發(fā)生改變的。
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標(biāo)記的當(dāng)前的position后,如果們調(diào)用flip,這個(gè)時(shí)候Limit就會(huì)指向position的位置,并將mark和position還原為初始值。這樣就知道了limit當(dāng)前的就為2,什么意思呢?就是說(shuō)當(dāng)前可以讀的字節(jié)數(shù)是2。
我們可以嘗試一下如下代碼:
?
Java代碼 ? ? 收藏代碼
  1. System.out.println(( char )buff.get()+ "" +( char )buff.get());??
?? ?輸出結(jié)果:he
??? 貌似這也沒(méi)什么稀奇的,如果你在代碼換成
?
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. 輸出結(jié)果:<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>??
?? 為什么會(huì)拋異常呢?原因是limit的含義就想一個(gè)窗口,你當(dāng)前能讀到的數(shù)據(jù)就是當(dāng)前窗口限制的(本例中即為2),如果這個(gè)窗口之外的所有元素都是不可讀的。至此我想你和我就應(yīng)該明白這幾個(gè)參數(shù)的含義了吧。
??? 而至于reset方法,它是將當(dāng)前的position設(shè)置為0,
???? rewind是將mark重置為-1,position重置為0;
???? clear方法是真正的重置,將mark=-1,position=0,limit=capacity(即當(dāng)前buffer的容量)

關(guān)于ByteBuffer使用解釋


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 夏邑县| 察隅县| 曲阳县| 花莲市| 陆良县| 辽阳县| 荆州市| 卢氏县| 县级市| 达尔| 开平市| 安溪县| 惠安县| 淮北市| 定州市| 漾濞| 平武县| 沙洋县| 灵石县| 梧州市| 运城市| 天台县| 留坝县| 林甸县| 稻城县| 巴林右旗| 南雄市| 娱乐| 芮城县| 灯塔市| 搜索| 通州市| 茶陵县| 会泽县| 加查县| 甘孜县| 南丹县| 珲春市| 凤台县| 南郑县| 平原县|