final Buffer rewind()方法的作用:重绕此缓冲区,将位置设置为0并丢弃标记。该方法的内部源代码如下。
public final Buffer rewind() { position = 0; mark = -1; return this; }
在一系列通道“重新写入或获取”的操作之前调用此方法(假定已经适当设置了限制)。例如:
out.write(buf); // 将buf的remaining剩余空间的数据输出到out中 buf.rewind(); // rewind重绕缓冲区 buf.get(array); // 从缓冲区获取数据保存到array中
rewind()方法的通俗解释就是“标记清除,位置position值归0,limit不变”。
rewind()方法没有设置限制,说明此方法可以结合自定义的limit限制值。
注意:rewind()方法常在重新读取缓冲区中数据时使用。
final Buffer clear()方法的作用:清除此缓冲区,将位置设置为0,将限制设置为容量,并丢弃标记,方法内部的源代码如下。
public final Buffer clear() { position = 0; limit = capacity; mark = -1; return this; }
方法clear()的主要使用场景是在对缓冲区进行存储数据之前调用此方法。例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
此方法不能实际清除缓冲区中的数据,但从名称来看它似乎能够这样做,这样命名是因为它多数情况下确实是在清除数据时使用。
clear()方法的通俗解释是“一切为默认”。
final Buffer flip()方法的作用:反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为0。如果已定义了标记,则丢弃该标记,方法内部的源代码如下:
public final Buffer flip() { limit = position; position = 0; mark = -1; return this; }
flip()方法的通俗解释是“缩小limit的范围,类似于String.subString(0,endIndex)方法”。
rewind()、clear()和flip()方法在官方帮助文档中的解释如下。
·rewind():使缓冲区为“重新读取”已包含的数据做好准备,它使限制保持不变,将位置设置为0。
·clear():使缓冲区为一系列新的通道读取或相对put(value)操作做好准备,即它将限制设置为容量大小,将位置设置为0。
·flip():使缓冲区为一系列新的通道写入或相对get(value)操作做好准备,即它将限制设置为当前位置,然后将位置设置为0。
这3个方法的侧重点在于:
1)rewind()方法的侧重点在“重新”,在重新读取、重新写入时可以使用;
2)clear()方法的侧重点在“还原一切状态”;
3)flip()方法的侧重点在substring截取。
示例代码如下:
public class Test14 { public static void main(String[] args) { byte[] byteArray = new byte[] { 1, 2, 3, 4, 5 }; ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray); System.out.println("capacity=" + byteBuffer.capacity() + " limit=" + byteBuffer.limit() + " position=" + byteBuffer.position()); byteBuffer.position(1); byteBuffer.limit(3); byteBuffer.mark(); System.out.println("capacity=" + byteBuffer.capacity() + " limit=" + byteBuffer.limit() + " position=" + byteBuffer.position()); byteBuffer.rewind(); System.out.println("capacity=" + byteBuffer.capacity() + " limit=" + byteBuffer.limit() + " position=" + byteBuffer.position()); byteBuffer.reset(); } }
程序运行结果如下:
capacity=5 limit=5 position=0 capacity=5 limit=3 position=1 capacity=5 limit=3 position=0 Exception in thread "main" java.nio.InvalidMarkException at java.nio.Buffer.reset(Buffer.java:306) at BufferAPITest.Test14.main(Test14.java:24)