购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3.13 重绕缓冲区

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();

}
}

程序运行结果如下: peZ3t3cSDpof2SrSyqJFhi5tO6Tn6EJgdDJ1rXog6WWisdKwmt81Tfhwddf/iB/C

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)
点击中间区域
呼出菜单
上一章
目录
下一章
×