一、缓冲区
缓冲区底层是依赖数组实现,主要涉及三个概念,limit、capacity和position。
- capacity: 容量,代表改缓冲区能够存放数据的最大容量。
- limit: 在写入数据时,代表数据写入最大限制,一般和容量一样;但是在读取数据时,limit则代表的是数据读取最大限制,一般是写入时的数据量。
- position: 位置,代表数据正在写入或者正在读取的位置。
1.1 创建
我们以ByteBuffer来解析缓冲区及其api运用,首先创建有8个子节点的缓冲区,此时结构图如下所示:
1.2 写入
当我们向缓冲区写入3个字节的数据,那么结构图如下所示:
1.3 flip
如果我们的数据已经写完,现在需要读取缓冲区的数据时,就需要调用flip()函数: 可以看到position赋值给了limit,从而限制数据只能读到3那里就必须结束,而position又指向0,准备从0开始读取。
/** 源码 */
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
1.4 读取
缓冲区的数据被读取完成的结构图:
1.5 clear
缓冲区写入读取完成,如果需要继续利用缓冲区写入读取的话,就需要调取clear()方法: 可以看见缓冲区又和初始化一样的状态,这样就可以循环使用了。
/** 源码 */
public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
}