Java NIO Buffer 的核心属性是 position、limit、capacity,三者满足 0 ≤ mark ≤ position ≤ limit ≤ capacity;capacity 是固定容量不可变,position 指向下一个读写位置,limit 标识当前模式下操作边界,flip 将 limit 设为 position 并重置 position 为 0,clear 重置 position 为 0、limit 为 capacity。

Java NIO 中的 Buffer 是数据读写的中转站,它的行为由三个不可分割的核心属性控制:**position、limit、capacity**。理解它们的关系和变化规律,是正确使用 flip、clear、rewind 等关键方法的基础。
capacity(容量):缓冲区的“硬边界”
capacity 表示缓冲区能容纳的最大元素数量,由创建时决定,**全程不可修改**。它对应底层数组的实际大小,比如 ByteBuffer.allocate(1024) 的 capacity 就是 1024 字节。
- 调用
capacity()可随时获取该值 - 超出 capacity 写入会直接抛出
BufferOverflowException - 它不随读写操作变化,是整个生命周期的固定上限
position(位置):当前操作的“指针”
position 总是指向下一个将要读或写的元素索引,初始为 0。它像一个游标,在每次相对读写后自动递进。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写入时:每 put 一个元素,position +1;写满后 position == limit
- 读取时:每 get 一个元素,position +1;读完后 position == limit
- 可手动设置:
position(int),但必须满足0 ≤ 新值 ≤ limit
limit(限制):有效数据的“终点哨兵”
limit 定义了当前模式下允许操作的边界——它是第一个**不可读/不可写**元素的索引。它的值取决于 Buffer 所处的模式:
立即学习“Java免费学习笔记(深入)”;
- 写模式:limit 默认等于 capacity,表示“还能写多少”
- 读模式:limit 被设为写入结束时的 position,表示“最多能读多少”
- flip() 的本质就是:
limit = position; position = 0 - 超过 limit 读写会触发
BufferUnderflowException或BufferOverflowException
三者关系与典型流转
它们始终维持一个不变式:0 ≤ mark ≤ position ≤ limit ≤ capacity。一次标准的写→读流程如下:
- 新建 buffer:
position=0, limit=capacity - 写入 5 字节:
position=5, limit=capacity - 调用 flip():
limit=5, position=0 - 读取 5 字节:
position=5, limit=5 - 调用 clear():
position=0, limit=capacity(mark 清除,准备下一轮)

















