一、缓冲区

缓冲区底层是依赖数组实现,主要涉及三个概念,limitcapacityposition

  • capacity: 容量,代表改缓冲区能够存放数据的最大容量。
  • limit: 在写入数据时,代表数据写入最大限制,一般和容量一样;但是在读取数据时,limit则代表的是数据读取最大限制,一般是写入时的数据量。
  • position: 位置,代表数据正在写入或者正在读取的位置。

    1.1 创建

    我们以ByteBuffer来解析缓冲区及其api运用,首先创建有8个子节点的缓冲区,此时结构图如下所示:

image.png

1.2 写入

当我们向缓冲区写入3个字节的数据,那么结构图如下所示:

image.png

1.3 flip

如果我们的数据已经写完,现在需要读取缓冲区的数据时,就需要调用flip()函数: 可以看到position赋值给了limit,从而限制数据只能读到3那里就必须结束,而position又指向0,准备从0开始读取。

  1. /** 源码 */
  2. public final Buffer flip() {
  3. limit = position;
  4. position = 0;
  5. mark = -1;
  6. return this;
  7. }

image.png

1.4 读取

缓冲区的数据被读取完成的结构图:

image.png

1.5 clear

缓冲区写入读取完成,如果需要继续利用缓冲区写入读取的话,就需要调取clear()方法: 可以看见缓冲区又和初始化一样的状态,这样就可以循环使用了。

  1. /** 源码 */
  2. public final Buffer clear() {
  3. position = 0;
  4. limit = capacity;
  5. mark = -1;
  6. return this;
  7. }

image.png