绝对读写

put(int index, byte b) 绝对写,向 byteBuffer 底层的 bytes 中下标为 index 的位置插入
byte b,不改变 position 的值。
get(int index)属于绝对读,读取 byteBuffer 底层的 bytes 中下标为 index 的 byte,不改变 position。

rewind()方法

Buffer.rewind()将 position 设回 0,所以你可以重读 Buffer 中的所有数据。limit 保持不变,仍然表示能从 Buffer 中读取多少个元素(byte、char 等)。

  1. // rewind 从头开始读
  2. buffer.get(new byte[4]);
  3. debugAll(buffer);
  4. buffer.rewind();
  5. System.out.println((char)buffer.get());

clear()与 compact()方法

一旦读完Buffer 中的数据,需要让Buffer 准备好再次被写入。可以通过clear()或compact()
方法来完成。
如果调用的是 clear()方法,position 将被设回 0,limit 被设置成 capacity 的值。换句话说,Buffer 被清空了。Buffer 中的数据并未清除,只是这些标记告诉我们可以从哪里开始往Buffer 里写数据。
如果 Buffer 中有一些未读的数据,调用 clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。

如果 Buffer 中仍有未读的数据,且后续还需要这些数据,但是此时想要先先写些数据, 那么使用 compact()方法。
compact()方法将所有未读的数据拷贝到 Buffer 起始处。然后将 position 设到最后一个未读元素正后面。limit 属性依然像 clear()方法一样,设置成 capacity。现在 Buffer 准备好写数据了,但是不会覆盖未读的数据。

mark()与 reset()方法

通过调用 Buffer.mark()方法,可以标记 Buffer 中的一个特定 position。之后可以通过调用 Buffer.reset()方法恢复到这个 position。例如:
buffer.mark(); //call buffer.get() a couple of times, e.g. during parsing.
buffer.reset(); //set position back to mark.

  1. // mark & reset
  2. // mark 做一个标记,记录 position 位置, reset 是将 position 重置到 mark 的位置
  3. System.out.println((char) buffer.get());
  4. System.out.println((char) buffer.get());
  5. buffer.mark(); // 加标记,索引2 的位置
  6. System.out.println((char) buffer.get());
  7. System.out.println((char) buffer.get());
  8. buffer.reset(); // 将 position 重置到索引 2
  9. System.out.println((char) buffer.get());
  10. System.out.println((char) buffer.get());

equals()

当满足下列条件时,表示两个 Buffer 相等:

  1. 有相同的类型(byte、char、int 等)。
  2. Buffer 中剩余的 byte、char 等的个数相等。
  3. Buffer 中所有剩余的 byte、char 等都相同。

如你所见,equals 只是比较 Buffer 的一部分,不是每一个在它里面的元素都比较。实际上,它只比较 Buffer 中的剩余元素。

compareTo()方法

compareTo()方法比较两个 Buffer 的剩余元素(byte、char 等),
如果满足下列条件,则认为一个 Buffer“小于”另一个 Buffer:

  • 第一个不相等的元素小于另一个 Buffer 中对应的元素 。
  • 所有元素都相等,但第一个 Buffer 比另一个先耗尽(第一个 Buffer 的元素个数比另一个少)。