bytebuffer.flip() 和 bytebuffer.rewind() 之间的区别

2022-09-01 13:06:08

我知道 flip() 将当前缓冲区位置设置为 0 并将限制设置为上一个缓冲区位置,而 rewind() 只是将当前缓冲区位置设置为 0。

在下面的代码中,我要么使用rewind()要么使用flip(),我得到相同的结果。

byte b = 127;
bb.put(b);
bb.rewind();//or flip();

System.out.println(bb.get());
bb.rewind();// or flip();
System.out.println(bb.get());

你能给我一个真实的例子,说明这两种方法的差异真的很重要吗?提前致谢。


答案 1

从源代码来看,它们非常相似。您可以看到以下内容:

public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

public final Buffer rewind() {
    position = 0;
    mark = -1;
    return this;
}

所以不同之处在于将 设置为 ,而不是。假设您分配了一个包含 8 个字节的缓冲区,您用 4 个字节填充了缓冲区,则位置设置为 3,如下所示:fliplimitpositionrewind

    [ 1  1  1  1  0  0  0  0]
               |           |
flip           limit       |
rewind                     limit

所以刚用过的限制已经设置妥当了。rewind


答案 2

它们根本不是等同的。

A 通常已准备好(或用于 )。ByteBufferread()put()

flip()使它准备好(或准备)。write()get()

rewind()并使其在(或)之后再次准备就绪。compact()clear()read()/put()write()get()


推荐