在研究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)