remaining()返回当前可读字节数,等价于limit()-position(),用于安全判断未读数据量;不可用capacity()-position()替代,因capacity包含未写入空间;flip()后remaining()等于已写入字节数。

在 Java NIO 中,remaining() 方法直接返回缓冲区当前**剩余可读(或可写)的字节数**,无需手动计算。它等价于 limit() - position(),是判断还有多少数据未被读取(或还能写入多少)最简洁、最安全的方式。
remaining() 就是剩余可读字节数
remaining() 的设计目的就是告诉你“从当前位置到限制位置之间还有多少元素可用”。对 ByteBuffer 来说,这个“元素”就是字节。
- 调用
get()或get(byte[])等读操作时,position会自动后移,remaining()随之减少 - 调用
flip()后,limit被设为原position,position归零,此时remaining()就等于之前写入的字节数 - 只要没调用
clear()或compact(),remaining()始终反映当前可读的字节数
别用 capacity() - position() 替代 remaining()
capacity() 是缓冲区总容量,不代表实际有数据的位置。如果只写了部分数据(比如写入了 100 字节但容量是 1024),capacity() - position() 会错误地返回 1024−100=924,而实际可读的只有 100 字节。
正确做法始终是:用 remaining() 判断还能读多少,而不是靠 capacity() 或 limit() 手动算。
典型读取循环中怎么用
在网络读取场景中,常配合 Channel.read(buffer) 使用:
ByteBuffer buf = ByteBuffer.allocate(1024);
int n = channel.read(buf); // 返回实际读到的字节数(可能为 0 或 -1)
if (n > 0) {
buf.flip(); // 准备读取
int readable = buf.remaining(); // ✅ 正确:当前可读字节数
byte[] data = new byte[readable];
buf.get(data); // 一次性读完
}
注意 flip() 和 compact() 对 remaining() 的影响
remaining() 的值依赖于 position 和 limit 的当前状态:
-
flip():limit ← position,position ← 0→remaining() = limit − position = 原 position -
compact():把未读数据移到开头,position设为已读长度,limit设为capacity→remaining() = capacity − 已读长度 -
clear():重置为全空状态 →remaining() = capacity
所以每次读写前,确认缓冲区处于预期状态(如读前 flip()),再调用 remaining() 才有意义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











