- 跟闪电侠学Netty:Netty即时聊天实战与底层原理
- 俞超
- 488字
- 2022-05-05 22:12:48
7.1 ByteBuf的结构
首先,我们来了解一下ByteBuf的结构,如下图所示。
从ByteBuf的结构图可以看到:
1.ByteBuf是一个字节容器,容器里面的数据分为三部分,第一部分是已经丢弃的字节,这部分数据是无效的;第二部分是可读字节,这部分数据是ByteBuf的主体数据,从ByteBuf里读取的数据都来自这一部分;最后一部分的数据是可写字节,所有写到ByteBuf的数据都会写到这一段。后面的虚线部分表示该ByteBuf最多还能扩容多少容量。
2.以上三部分内容是被两个指针划分出来的,从左到右依次是读指针(readerIndex)和写指针(writerIndex)。还有一个变量capacity,表示ByteBuf底层内存的总容量。
3.从ByteBuf中每读取一字节,readerIndex自增1,ByteBuf里总共有writerIndex-readerIndex字节可读。由此可以知道,当readerIndex与writerIndex相等的时候,ByteBuf不可读。
4.写数据是从writerIndex指向的部分开始写的,每写一字节,writerIndex自增1,直到增到capacity。这个时候,表示ByteBuf已经不可写。
5.ByteBuf里其实还有一个参数maxCapacity。当向ByteBuf写数据的时候,如果容量不足,则可以进行扩容,直到capacity扩容到maxCapacity,超过maxCapacity就会报错。
Netty使用ByteBuf这个数据结构可以有效地区分可读数据和可写数据,读写之间相互没有冲突。当然,ByteBuf只是对二进制数据的抽象,具体底层的实现我们后面会讲到。在这里,读者只需要知道Netty关于数据读写只认ByteBuf。下面我们来学习ByteBuf常用的API。