bytebuffer 的 putlong() 和 getlong() 方法可直接读写 8 字节 long 值,自动更新 position,需注意字节序一致及剩余容量检查;示例中分配 16 字节缓冲区,连续写入两个 long 后 flip 再读取,结果正确。

Java NIO 的 ByteBuffer 提供了针对基本类型(如 long)的专用读写方法,putLong() 和 getLong() 可以直接存取 8 字节的 long 值,无需手动拆解字节。关键在于理解缓冲区位置(position)、字节序(byte order)和边界检查。
putLong():把 long 写入 ByteBuffer
putLong(long value) 将当前 position 开始的 8 个字节设为该 long 的二进制表示,然后自动将 position 增加 8。如果剩余容量不足 8 字节,会抛出 BufferOverflowException。
- 默认使用当前 buffer 的 byte order(通常是
BIG_ENDIAN),可通过order(ByteOrder.LITTLE_ENDIAN)修改 - 若想写入指定索引位置(不移动 position),用
putLong(int index, long value) - 示例:
buffer.putLong(123456789012345L);—— 写入后 position 自动 +8
getLong():从 ByteBuffer 读取 long
getLong() 从当前 position 开始读取 8 字节,按当前 byte order 解析为 long,并将 position 增加 8。若剩余字节数不足 8,抛出 BufferUnderflowException。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 同样支持带索引版本:
getLong(int index),不改变 position - 读取结果与写入时的 byte order 必须一致,否则数值错误(比如 BIG_ENDIAN 写入、LITTLE_ENDIAN 读取会得到错误值)
- 示例:
long x = buffer.getLong();—— 读完后 position 自动 +8
注意字节序和 position 管理
ByteBuffer 默认是大端序(network byte order),但某些协议或硬件要求小端序。务必在读写前统一设置:
buffer.order(ByteOrder.LITTLE_ENDIAN);- 写完后若需重复读取,可用
buffer.rewind()或buffer.position(0) - 用
buffer.remaining()检查是否还有足够空间/数据再调用 putLong/getLong
完整小例子
创建一个容量为 16 的 buffer,写入两个 long,再读出来:
ByteBuffer buffer = ByteBuffer.allocate(16); buffer.putLong(100L).putLong(200L); // 链式调用,position 变为 16 buffer.flip(); // 切换为读模式,position=0,limit=16 long a = buffer.getLong(); // a == 100L,position=8 long b = buffer.getLong(); // b == 200L,position=16
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










