remaining()返回limit-position的非负整数,hasremaining()是其布尔版;二者均判断缓冲区是否还有有效数据,读写循环中推荐用hasremaining()安全控制流程。

remaining() 返回当前还能读或写的字节数,hasRemaining() 是它的布尔快捷版 —— 二者本质一致,都基于 limit - position 的差值判断缓冲区是否还有有效数据可操作。
remaining():返回剩余可操作字节数
它计算的是 limit - position,结果总是非负整数。无论缓冲区处于读模式还是写模式,只要 position ,就说明还有空间/数据可处理。
- 写入后未 flip:
position在数据末尾,limit还是容量,remaining()表示还能继续写多少字节 - flip 后进入读模式:
limit被设为写入长度,position归零,remaining()就是待读的字节数 - 读了一部分后:
position前移,remaining()动态减少,反映剩余未读字节数
hasRemaining():更简洁的条件判断
它等价于 remaining() > 0,常用于循环中判断是否还有数据要处理,语义更清晰,避免手误写成 != 0 或漏判边界。
- 读循环推荐写法:
while (buffer.hasRemaining()) { buffer.get(); } - 写循环也适用:
while (buffer.hasRemaining() && src.hasRemaining()) { buffer.put(src.get()); } - 比
buffer.position() 更直观,且不易受 mark、capacity 等干扰
注意:它们不区分读/写意图,只看 position 和 limit
这两个方法不关心你“想读”还是“想写”,只忠实地反映当前 position 到 limit 之间的区间长度。因此必须确保缓冲区处于正确模式(如 flip 后读、clear 后写),否则逻辑会出错。
- 忘记 flip 就调用
hasRemaining()判断读取?可能返回很大数值,导致越界或阻塞 - clear 后未写满就调用
remaining()?它返回的是剩余空闲容量,不是已写入内容长度 - compact 后 position 被重置,limit 保持原 limit,remaining() 反映的是 compact 后可写入的空间
典型使用场景示例
比如从通道读取数据到 buffer,再逐字节解析:
ByteBuffer buffer = ByteBuffer.allocate(1024);
int n = channel.read(buffer);
if (n > 0) {
buffer.flip(); // 切换到读模式
while (buffer.hasRemaining()) {
byte b = buffer.get();
process(b);
}
buffer.clear(); // 准备下次读
}
这里 hasRemaining() 安全地控制读循环,无需手动比较 position 和 limit,也不用担心初始状态影响。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











