Netty第一章NIO,ByteBuffer 中,‌limit解释

在 ByteBuffer 中,‌limit‌ 指的是‌当前缓冲区中可读或可写数据的边界索引‌。它定义了你可以操作的数据范围上限。

具体来说,limit 的含义取决于缓冲区当前处于"写模式"还是"读模式":

1. 核心定义

位置关系‌:始终满足 0 <= position <= limit <= capacity。

作用‌:它限制了 position 指针能移动到的最大位置。当你调用 get() 或 put() relative(相对)方法时,如果 position 达到 limit,就会抛出 BufferUnderflowException 或 BufferOverflowException。

2. 不同场景下的具体含义

A. 写模式(刚创建或 clear 后)

含义‌:表示‌最多还能写入多少数据‌。

值‌:通常等于 capacity(缓冲区的总容量)。

示例‌:如果 capacity 是 1024,limit 也是 1024。你可以从 position=0 一直写到 position=1023。

B. 读模式(flip 后)

含义‌:表示‌还有多少数据可供读取‌。

值‌:等于之前写入数据后的 position 值。

示例‌:如果你写入了 100 个字节,此时 position=100。调用 flip() 后,limit 被设置为 100。这意味着你只能读取索引 0 到 99 的数据,防止读到未初始化的垃圾数据。

3. 常见操作对 Limit 的影响

操作 对 Limit 的影响 说明
allocate(cap) limit = capacity 初始化时,限制等于总容量,准备写入。
flip() limit = old position ‌关键操作‌:将限制设为刚才写入数据的末尾,准备读取有效数据。
clear() limit = capacity 重置限制为总容量,准备重新写入(覆盖旧数据)。
rewind() ‌不变‌ 仅重置 position 为 0,limit 保持原样,用于重复读取。
compact() limit = capacity 压缩后,将限制重置为总容量,准备在剩余空间继续写入。

**总结‌:**limit 是一个‌安全边界‌,它告诉缓冲区:"在这个索引之前的数据是有效的(可读)"或者"在这个索引之前的空间是可用的(可写)"。在 position(0) 这种手动重置指针的操作中,确保 limit 设置正确尤为重要,否则可能会读到无效数据。