Java NIO Buffer通过调整position、limit和mark指针控制读写边界,clear()重置为写模式(position=0, limit=capacity),flip()切换到读模式(limit=position, position=0),rewind()重置position=0但保留limit,三者均不擦除底层数据。

Java NIO 中的 Buffer(如 ByteBuffer)不是靠“清空数据”来重置,而是通过调整内部三个关键指针——position、limit 和 mark——来控制读写边界。clear、flip、rewind 本质是重置这些逻辑指针,不擦除底层数组内容。
clear():准备重新写入,重置为写模式
适用于写完一批数据、准备覆盖写入新内容的场景。它把缓冲区“归位”到可写状态:
- position ← 0:下次写从开头开始
- limit ← capacity:允许写满整个缓冲区
- mark ← -1:丢弃之前设置的标记
注意:真实数据仍在数组里,只是后续 put() 会从头覆盖。常用于通道读取前(如 channel.read(buffer) 前调用 buffer.clear())。
flip():从写切到读,锁定已写范围
这是读写切换的核心操作,确保只读取已写入的有效数据:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- limit ← position:把当前写入终点设为读上限(即只读已填内容)
- position ← 0:读从开头开始
- mark ← -1:清除标记
例如:写入 "hello" 后 position=5,调用 flip() 后 limit=5, position=0,get() 就能安全读出 5 个字节,不会越界读到未初始化区域。
rewind():重头读/重头写,不改变有效数据边界
当你想重复读取已有内容,或放弃当前位置、从头再写(但保留原 limit),就用它:
- position ← 0
- mark ← -1
- limit 不变:仍保持 flip 后的值,或写模式下原始 capacity
典型用途:读取完部分数据后,想再遍历一遍;或写了一半发现要重来,又不想清掉已写内容(比如只写前半段,想从头覆盖)。它比 clear() 更保守——不扩大可写范围,只归零位置。
这三个方法都不动底层数据,只改指针;它们都返回 this,支持链式调用;且所有 Buffer 子类行为一致。理解 position/limit 的语义随读写模式变化,是掌握它们的关键。

















