Netty源码ByteBuf2021SC@SDUSC

ByteBuf是Netty框架中的核心组件,它提供了一种高效的方式来处理网络I/O。ByteBuf具有读写指针,支持顺序访问,并允许在读取后丢弃已读数据。通过调用clear()可以重置读写索引而不影响内容。此外,还可以使用indexOf、bytesBefore等方法进行搜索操作,以及使用标记和重置功能来保存和恢复索引位置。派生缓冲区功能则允许从现有缓冲区创建新的视图。
摘要由CSDN通过智能技术生成

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 中的标记和重置方法类似。
派生缓冲区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值