绍兴易网网站开发,linux网站架设怎么做,从网上下载的网站源码怎么用,天津建设工程信息网网页版转载自 关于ByteBuffer使用解释之前看过相关的ByteBuffer的使用#xff0c;但是问题是那时还年轻#xff0c;所以现在有点老了#xff0c;因此#xff0c;忘记了#xff0c;所以决心看源代码了解一番----故作此篇文章。查看ByteBuffer的API#xff0c;看的我是一头雾水但是问题是那时还年轻所以现在有点老了因此忘记了所以决心看源代码了解一番----故作此篇文章。查看ByteBuffer的API看的我是一头雾水搞不清什么mark、position、limit、flip、reset几个的用法先看下面的例子 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());
输出结果: position:0 limit:10 position:2 limit:10 position:2 limit:10 position:0 limit:2 我们以每位开发人员熟悉的”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-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。我们可以尝试一下如下代码System.out.println((char)buff.get()(char)buff.get()); 输出结果:he貌似这也没什么稀奇的如果你在代码换成// System.out.println((char)buff.get()(char)buff.get() System.out.println((char)buff.get()(char)buff.get()(char)buff.get()); 输出结果: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 为什么会抛异常呢原因是limit的含义就想一个窗口你当前能读到的数据就是当前窗口限制的(本例中即为2),如果这个窗口之外的所有元素都是不可读的。至此我想你和我就应该明白这几个参数的含义了吧。而至于reset方法它是将当前的position设置为0rewind是将mark重置为-1,position重置为0;clear方法是真正的重置将mark-1,position0,limitcapacity(即当前buffer的容量)