关于ByteBuffer使用解释
之前看过相关的ByteBuffer的使用,但是问题是那时还年轻,所以现在有点老了,因此,忘记了,所以决心看源代码了解一番----故作此篇文章。
?
查看ByteBuffer的API,看的我是一头雾水,搞不清什么mark、position、limit、flip、reset几个的用法,先看下面的例子:
Java代码- ?????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());<span?style="white-space:?pre;">????</span>??
- <pre?name="code"?class="java">输出结果:??
- position:0??limit:10??
- position:2??limit:10??
- position:2??limit:10??
- position:0??limit:2??
- </pre>??
- ???
????初始情况下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。我们可以尝试一下如下代码:?Java代码
- System.out.println((char)buff.get()+""+(char)buff.get());??
- //?System.out.println((char)buff.get()+""+(char)buff.get()??
- ???System.out.println((char)buff.get()+""+(char)buff.get()+""+(char)buff.get());??
- 输出结果:<pre?name="code"?class="java">position:0????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??
- </pre>??