flip和clear本质是调整position与limit指针而非清空数据:flip将position赋给limit再置position为0,用于写后读;clear将position置0、limit置capacity,用于读后写;rewind仅重置position,不可替代clear。

Java NIO 中 Buffer 的 flip 和 clear 切换,本质不是“清空数据”,而是调整 position 和 limit 两个指针,从而改变缓冲区的读写边界。
flip:写完后准备读,锁定已写入的有效范围
当你用 put() 写入数据,或 channel.read(buffer) 接收完一批字节后,position 已移到写入末尾,limit 仍等于 capacity。此时直接 get() 会越界或读到未初始化内容。
flip() 做两件事:
- 把当前
position赋给limit(即:有效数据长度 = 原 position) - 把
position设为 0(读从开头开始) - 清除
mark
例如:容量 1024 的 buffer,写入 64 字节后 position=64,调用 flip() 后 limit=64、position=0,后续 get() 就能安全读出全部 64 字节。
立即学习“Java免费学习笔记(深入)”;
clear:读完后准备再写,恢复全容量可写状态
当 buffer.hasRemaining() 返回 false(即 position == limit),说明上一轮数据已全部读完。若要复用 buffer 接收下一次数据,必须重置为“可写起始状态”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
clear() 做三件事:
- 把
position设为 0 - 把
limit设为capacity - 清除
mark
注意:底层数组内容不擦除,只是指针重置;下次 put() 或 channel.read(buffer) 会自然覆盖旧数据。漏掉 clear(),下一次读可能因 position > 0 导致实际可用空间变小,甚至写不进数据。
别把 rewind 当 clear 用
rewind() 只把 position 设为 0,limit 不变。它适用于想重读一遍刚写入的内容,但不适用于准备新写入——因为 limit 还卡在上次 flip() 后的值,后续 put() 可能越界或无法写满缓冲区。
典型循环链:read → flip → get → clear → repeat
这是网络或文件 I/O 的主干流程:
- 分配 buffer:
ByteBuffer buffer = ByteBuffer.allocate(1024) - 读通道:
channel.read(buffer)(自动写入,position增加) - 切换读:
buffer.flip() - 处理数据:
while (buffer.hasRemaining()) { process(buffer.get()); } - 复用写:
buffer.clear()(等待下一次read())
漏掉 flip(),读不到数据;漏掉 clear(),下一轮写入会出问题。

















