2021SC@SDUSC
文章目录
ByteBuf介绍
ByteBuf是一个缓冲区数组,同时它继承自ReferenceCounted,和Comparable< ByteBuf >
与普通的基本字节数组一样,ByteBuf使用基于零的索引。这意味着第一个字节的索引始终为0,最后一个字节的索引始终为容量-1
顺序访问索引
ByteBuf 提供了两个指针变量来支持顺序读写操作——readerIndex 分别用于读操作和 writerIndex 用于写操作。下图显示了缓冲区如何被两个指针分割成三个区域:
可读字节(实际内容)
该段是存储实际数据的地方。任何名称以 read 或 skip 开头的操作都会获取或跳过当前 readerIndex 处的数据,并将其增加读取字节数。如果读操作的参数也是一个 ByteBuf 并且没有指定目标索引,则指定缓冲区的 writerIndex 一起增加。
如果剩余的内容不足,则会引发 IndexOutOfBoundsException。新分配、包装或复制的缓冲区的 readerIndex 的默认值为 0。
·········································································································································································
可写字节
该段是一个未定义的空间,需要填充。任何名称以 write 开头的操作都将在当前 writerIndex 写入数据并增加写入字节数。如果写操作的参数也是一个ByteBuf,并且没有指定源索引,则指定缓冲区的readerIndex一起增加。
如果没有足够的可写字节,则会引发 IndexOutOfBoundsException。新分配的缓冲区的 writerIndex 的默认值为 0。包装或复制的缓冲区的 writerIndex 的默认值是缓冲区的容量。
·········································································································································································
可丢弃字节
该段包含已被读取操作读取的字节。最初,该段的大小为 0,但随着读取操作的执行,其大小增加到 writerIndex。可以通过调用discardReadBytes()回收未使用的区域来丢弃读取的字节,如下图所示:
请注意,调用discardReadBytes()后无法保证可写字节的内容。在大多数情况下,可写字节不会被移动,甚至可以用完全不同的数据填充,具体取决于底层缓冲区实现。
清除缓冲区索引
您可以通过调用 clear() 将 readerIndex 和 writerIndex 都设置为 0。它不会清除缓冲区内容(例如用 0 填充),而只是清除两个指针。另请注意,此操作的语义与 ByteBuffer.clear() 不同。
搜索操作
对于简单的单字节搜索,请使用 indexOf(int, int, byte) 和 bytesBefore(int, int, byte)。 bytesBefore(byte) 在处理以 NUL 结尾的字符串时特别有用。对于复杂的搜索,将 forEachByte(int, int, ByteProcessor) 与 ByteProcessor 实现一起使用。
标记和重置
每个缓冲区中有两个标记索引。一个用于存储 readerIndex,另一个用于存储 writerIndex。您始终可以通过调用 reset 方法重新定位两个索引之一。除了没有读取限制之外,它的工作方式与 InputStream 中的标记和重置方法类似。
派生缓冲区