capacity是缓冲区硬性上限且固定不变,limit是动态软边界标识当前读写终点,position是游标指向下次操作索引;三者满足0≤position≤limit≤capacity,flip()将limit设为position并置position为0以切换读模式。

capacity 是缓冲区的“硬边界”
它代表底层数组能容纳的最大元素数,创建后就固定不变。比如 ByteBuffer.allocate(1024) 的 capacity 永远是 1024,不会因读写而增减。它不参与状态切换,只起安全护栏作用——任何操作超出 capacity 都会立刻抛 BufferOverflowException 或 BufferUnderflowException。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
position 是当前操作的“游标”
它始终指向下一个将被读或写的索引位置。初始值为 0;每次调用 put() 或 get() 后,position 自动加 1。它的意义取决于当前模式:
- 写模式下,position 表示已写入多少字节(即“写到哪了”);
- 读模式下,position 表示已读取多少字节(即“读到哪了”)。
手动设置 position(如 buffer.position(3))很常见,但必须确保不破坏 0 ≤ position ≤ limit 这一约束。
limit 是当前操作的“软边界”
它决定本次读或写最多能触达的位置(不包含 limit 本身)。它的值不是固定的,而是随模式切换动态调整:
- 写模式时,limit 通常等于 capacity,表示“还能写多少”;
- 调用 flip() 后,limit 被设为写入结束时的 position 值,变成“最多能读多少”;
- 调用 clear() 后,limit 恢复为 capacity,重新允许全量写入。
违反 limit(比如在 limit=5 时还尝试 get() 第 6 个元素)会直接触发异常。
三者协同的典型生命周期
一个完整读写循环中,它们按固定逻辑联动:
- allocate(8) → capacity=8, position=0, limit=8
- put('a'); put('b') → position=2, limit=8
- flip() → position=0, limit=2, capacity=8
- get() ×2 → position=2, limit=2
- clear() → position=0, limit=8, capacity=8
整个过程没有数据复制,仅靠三个整数的数值调整就完成模式切换,这正是 NIO 高效的核心所在。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










