flip()将position设为0、limit设为当前position,实现写模式到读模式切换;它不改变capacity和mark,仅调整这两个指针,典型流程为put→flip→get。

调用 flip() 是 Buffer 从“写模式”切换到“读模式”的关键操作,它不重置指针为 0,而是**重设 limit 为当前 position,并把 position 归零**,从而让后续的 get() 操作能从头开始读取已写入的数据。
flip 的实际效果:调整 position 和 limit
Buffer 内部有三个核心指针:position(当前读/写位置)、limit(读/写边界)、capacity(总容量)。刚创建时三者关系是:position = 0, limit = capacity,此时可写入。
写入若干字节后(比如 put() 了 5 个),position = 5,limit 仍为 capacity。此时若直接 get(),会从位置 5 开始读——但那里还没数据。flip 就是为解决这个而设计:
- 把 limit 设为当前 position(即标记“有效数据结束位置”)
- 把 position 设为 0(即准备从头开始读)
典型使用流程:put → flip → get
以 ByteBuffer 为例:
ByteBuffer buf = ByteBuffer.allocate(10); buf.put((byte)'H').put((byte)'e').put((byte)'l').put((byte)'l').put((byte)'o'); // 此时 position = 5, limit = 10 buf.flip(); // 关键一步:position=0, limit=5 byte b1 = buf.get(); // 'H',position 变为 1 byte b2 = buf.get(); // 'e',position 变为 2 // ……直到 position == limit(5)时再 get 会抛 BufferUnderflowException
注意:flip 不清空、不重置 capacity,也不影响 mark
flip 只动 position 和 limit,其他状态保持不变:
- 已写入的数据仍在 buffer 中,未被清除
- capacity 值不变,仍是原始分配大小
- 如果之前调用了 mark(),mark 的值不会变(但通常 flip 后 mark 已无意义,建议配合 reset() 或先 clear())
常见误用:忘记 flip 就读,或重复 flip
没 flip 就 get → 读不到数据(position 太大);flip 两次 → limit 变成 0,导致 get() 立即失败。
正确节奏是:写完 → flip → 读完 → 若需复用,调用 clear()(恢复写模式)或 compact()(保留未读数据)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











