ByteBuffer读写核心在于position、limit、capacity三者关系及flip()、clear()、compact()等方法对指针的调整:写模式默认启用,put()写入使position递增;flip()切读模式,置limit=原position、position=0;get()读取使position前移;读完用clear()重置为全写状态,或compact()压缩未读数据后追加写。

ByteBuffer 读写和模式切换的核心是 position、limit、capacity 三者的关系,以及调用 flip()、clear()、compact() 等方法来调整指针状态。
写入数据:进入写模式(初始默认状态)
创建后的 ByteBuffer 默认处于写模式,此时可以向缓冲区写入数据:
- 使用 put() 方法(如 put(byte)、put(byte[])、putChar() 等)写入数据,每次写入后 position 自动递增
- 写入不能超过 limit(初始时 limit == capacity),否则抛出 BufferOverflowException
- 示例:ByteBuffer buf = ByteBuffer.allocate(10); buf.put((byte)1).put((byte)2); // position 变为 2
从写转读:调用 flip() 切换到读模式
写完数据后,必须调用 flip() 才能安全读取,它会:
- 把当前 position 设为新的 limit(即有效数据长度)
- 把 position 重置为 0,为读取做准备
- 注意:flip() 不改变底层数据,只重设指针
- 示例:buf.flip(); // 此时 limit=2, position=0,可开始读
读取数据:在读模式下获取内容
调用 get() 相关方法读取数据,position 随之前移:
立即学习“Java免费学习笔记(深入)”;
- get() 返回当前 position 的值,并使 position +1
- get(byte[]) 批量读取,读到 limit 为止
- 读到 position == limit 时,再读会抛出 BufferUnderflowException
- 若需重复读取,可用 rewind()(position=0)或 mark()/reset()
读完后继续写:clear() 或 compact()
读完想再次写入,有两种常见选择:
- clear():重置为初始写状态(position=0, limit=capacity),但不擦除数据——适合丢弃已读内容,重新填满整个缓冲区
- compact():把未读完的数据移到开头(position → 0),limit 设为原 position + 剩余字节数,position 设为剩余字节数——适合“部分读取后追加写”场景
- 两者都不影响 capacity,也不清空底层数组


















