rewind()方法将position重置为0,limit、capacity及数据内容均保持不变;它不调整limit,仅重置读写位置,且会清除mark。

rewind() 方法的作用很直接:把 position 重设为 0,同时保持 limit 和底层数据完全不变。
rewind 的核心行为:只动 position,不动 limit
写入一段数据后,position 会移动到数据末尾。比如向容量为 10 的 ByteBuffer 写入 7 个字节,此时 position = 7,limit 仍为 10(初始值)。调用 rewind() 后:
-
position变为 0 -
limit保持 10 不变 -
capacity和实际存储的字节内容都不受影响
和 flip() 的关键区别:不调整 limit
flip() 是为“写→读”切换设计的,它会把 limit 设为当前 position,再把 position 归零——这样后续读操作只会读到已写入的有效数据部分。
rewind() 不做这一步。它假设你已经知道 limit 是合适的(比如之前调过 flip()),现在只是想从头再读一遍。
- 如果写完没 flip 就直接 rewind:读操作可能越界(读到未写入的脏数据)
- 如果先 flip 再 rewind:安全,因为 limit 已经被设为有效数据长度
典型使用场景
rewind 常用于需要多次遍历同一段缓冲区内容的情况,比如:
- 解析协议时先 scan 一遍找分隔符,再 rewind 逐字节 decode
- 校验数据前 rewind 到开头重新计算 checksum
- 调试时反复读取同一块 buffer 查看内容
注意 mark 和 reset 的配合
rewind 会清除 mark(设为 -1)。如果你只想回到某个中间位置而非开头,应该用 mark() + reset(),而不是依赖 rewind。
它不清理数据、不改变容量、也不影响 limit —— 就是单纯把读写指针拨回起点。

















