java nio buffer 的读写切换本质是调整 position、limit、mark 三个指针;flip() 将写转读,置 position=0、limit=position、mark=-1;clear() 重置为全容量可写,置 position=0、limit=capacity、mark=-1;rewind() 重复读已 flip 数据,仅置 position=0、mark=-1,limit 不变。

Java NIO 中 Buffer 的读写状态切换,本质不是切换“模式”,而是调整内部三个指针:position、limit 和 mark。缓冲区本身没有读/写开关,所有切换都靠手动调用方法来重置这些逻辑边界。
flip():写完后准备读,锁定有效数据范围
这是最常用也最容易出错的操作。它只在写入一批数据后、首次读取前调用,作用是把已写内容“封起来”,确保读操作不会越界读到未初始化区域。
- 执行
limit = position:把当前写入终点设为读上限 - 执行
position = 0:让下一次get()从头开始读 - 执行
mark = -1:清除之前可能设置的标记
例如:往容量为 10 的 buffer 中写入 6 个字节,此时 position=6, limit=10;调用 flip() 后变成 position=0, limit=6,后续 get() 最多读 6 次,安全可靠。
clear():读完后准备覆盖写,重置为全容量可写
适用于已确认全部数据处理完毕,要清空状态、重新写入新内容的场景。注意:它不擦除底层数据,只是让后续 put() 从头覆盖。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 执行
position = 0:下次写从索引 0 开始 - 执行
limit = capacity:允许写满整个缓冲区 - 执行
mark = -1
典型用法:每次调用 channel.read(buffer) 前,必须先 clear(),否则可能因 position 不为 0 导致写入位置偏移或空间不足。
rewind():重复读已加载的数据,不丢弃也不扩容
当你需要多次解析同一段已写入且已 flip 过的数据(比如校验、解密、分步解析),就用它。它不改变 limit,只把读指针拉回开头。
- 执行
position = 0 -
limit保持不变(仍是上次 flip 设定的有效长度) - 执行
mark = -1
例如:flip 后读了前 4 字节做协议识别,还想再读全部 12 字节做完整解析,直接 rewind() 就行,无需重新 flip 或 clear。
别踩坑:部分读之后别直接 flip()
如果已经调用 flip() 并读了一部分(比如 position 从 0 变成 3,limit 是 10),此时缓冲区处于“读模式中”,再调 flip() 会让 limit 变成 3,有效数据被意外截断。
- 想继续写新数据 + 保留未读旧数据?用
compact() - 只想丢弃全部旧数据重来?用
clear() - 想接着读剩下的?不用任何切换,继续
get()即可
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










