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 设置正确尤为重要,否则可能会读到无效数据。
