java.nio.Buffer分析

來源:互聯網
上載者:User

在研究Apache Mina原始碼時,在IoFilter中使用IoBuffer做為資料緩衝對象,而IoBuffer的實現來自於java.nio.Buffer。Buffer中的flip()、clear()、reset()、mark()等概念讓我有點糊塗,仔細看了jdk的文檔說明,才對Buffer對象的概念瞭然於胸。

 

在Buffer類當中有以下四個重要的屬性:

mark:標記位,用於reset()時把position恢複到原來的位置,調用mark()方法使position的值賦與mark

position:表示Buffer中第一個可以被讀取或寫入的資料的位置,每次調用put()方法時,把寫入的資料放到position位置,然後position的值就會加1

limit:表示buffer中第一個不可被讀取或寫入的資料的位置,也即停止位,資料操作到此為止

capacity:初始化時調用allocate(int size)為buffer分配的空間大小,不可變

 

示範代碼如下:

import java.nio.ByteBuffer;<br />public class ByteBufferTest {</p><p>public static void main(String[] args) {<br />ByteBuffer bb=ByteBuffer.allocate(10);<br />for(int i=1;i<9;i++){<br />bb.put((byte)i);<br />}</p><p>System.out.println("pos:"+bb.position());<br />System.out.println("limit:"+bb.limit());<br />System.out.println("cap:"+bb.capacity());</p><p>bb.flip();<br />System.out.println("/nafter flip");<br />System.out.println("pos:"+bb.position());<br />System.out.println("limit:"+bb.limit());<br />System.out.println("cap:"+bb.capacity());</p><p>bb.mark();<br />System.out.println("/nafter mark");<br />System.out.println("pos:"+bb.position());<br />System.out.println("limit:"+bb.limit());<br />System.out.println("cap:"+bb.capacity());</p><p>bb.reset();<br />System.out.println("/nafter reset");<br />System.out.println("pos:"+bb.position());<br />System.out.println("limit:"+bb.limit());<br />System.out.println("cap:"+bb.capacity());</p><p>bb.clear();<br />System.out.println("/nafter clear");<br />System.out.println("pos:"+bb.position());<br />System.out.println("limit:"+bb.limit());<br />System.out.println("cap:"+bb.capacity()); </p><p>bb.limit(1);<br />bb.put((byte)9);<br />bb.put((byte)10);//超出limit範圍,拋出java.nio.BufferOverflowException異常<br />bb.put((byte)11);<br />}<br />}<br />

 

輸出結果:

pos:8<br />limit:10<br />cap:10<br />after flip<br />pos:0<br />limit:8<br />cap:10<br />after mark<br />pos:0<br />limit:8<br />cap:10<br />after reset<br />pos:0<br />limit:8<br />cap:10<br />after clear<br />pos:0<br />limit:10<br />cap:10<br />Exception in thread "main" java.nio.BufferOverflowException<br />at java.nio.Buffer.nextPutIndex(Buffer.java:419)<br />at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:145)<br />at com.gftech.mytool.mina.ByteBufferTest.main(ByteBufferTest.java:45)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.