rewind() 将 position 重置为 0 而 limit 不变,用于重复读取已有数据;适用于所有 buffer 子类,不修改底层数据,语义明确且线程不安全。

Buffer 的 rewind() 方法用于将读写指针(position)重置为 0,同时保留 limit 不变,从而允许你从头开始重新读取已有的数据。它不改变底层数据内容,只影响后续的 get/put 操作起始位置。
rewind() 的作用和适用场景
当你已经对 Buffer 进行过若干次 get() 操作(比如读取了前几个字节),position 已经向前移动,此时想重新读取整个 Buffer 或从开头再次解析,就可以调用 rewind()。它比手动调用 position(0) 更语义明确,且是标准推荐做法。
- 适用于 ByteBuffer、CharBuffer、IntBuffer 等所有 Buffer 子类
- 不会清空或修改 buffer 中的实际数据
- limit 保持不变,确保后续读取不会越界
- 常用于“读—处理—再读”或“预读校验后回退”的逻辑中
基本用法示例
以下是一个典型使用 rewind() 重新读取 byte 数据的示例:
ByteBuffer buffer = ByteBuffer.allocate(8); buffer.put((byte) 1).put((byte) 2).put((byte) 3).put((byte) 4); buffer.flip(); // 准备读取:position=0, limit=4 // 第一次读取 System.out.println(buffer.get()); // 输出 1,position 变为 1 System.out.println(buffer.get()); // 输出 2,position 变为 2 // 调用 rewind() 重置 position 到 0 buffer.rewind(); // 再次读取,从头开始 System.out.println(buffer.get()); // 输出 1 System.out.println(buffer.get()); // 输出 2
rewind() 与其它重置方法的区别
注意不要混淆这几个相似操作:
- rewind():仅设 position = 0,limit 不变 → 适合重复读取已有数据
- clear():设 position = 0,limit = capacity → 为下一次写入做准备,会丢弃当前读取状态
- flip():设 limit = position,然后 position = 0 → 常用于写完后切换到读模式
- reset():仅在 mark() 被设置后才有效,将 position 设为 mark 值;未 mark 时调用会抛异常
注意事项
使用 rewind() 时需确保 Buffer 处于可读状态(即 limit ≥ position),否则可能读不到预期数据。常见错误包括:
- 在未 flip() 的写模式 buffer 上直接 rewind(),此时 limit = capacity,虽能读但可能读到未写入的脏数据
- 在 compact() 后误用 rewind() —— compact() 会移动数据并更新 position 和 limit,需结合具体需求判断是否需要 rewind
- 多线程环境下 Buffer 不是线程安全的,需自行同步










