bytebuffer.wrap()可零拷贝包装字节数组,capacity和limit等于数组长度、position为0,读写共享原数组;需注意线程安全、避免未flip直接get、勿误认其为只读。

Java NIO 中,可以用 ByteBuffer.wrap() 方法直接将现有字节数组包装成一个可读写的 ByteBuffer,无需复制数据,效率高且简洁。
使用 wrap() 包装字节数组
这是最常用、最直接的方式:
ByteBuffer buffer = ByteBuffer.wrap(byteArray);- 生成的 buffer 容量(capacity)和限制(limit)都等于数组长度,位置(position)为 0,初始状态可写(也可立即读,需调用
flip()) - 底层仍指向原数组,修改 buffer 内容会直接影响原数组,反之亦然
手动分配并填充(适合需要控制 position/limit 的场景)
如果需要自定义初始 position 或 limit(比如只操作数组某一段),可以:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 先用
ByteBuffer.allocateDirect()或ByteBuffer.allocate()创建 buffer - 再用
put(byteArray)或put(byteArray, offset, length)写入 - 例如:
buffer.put(src, 2, 5);表示从 src[2] 开始复制 5 个字节
注意共享与线程安全
被 wrap() 包装的 buffer 与原数组共享内存:
- 多线程同时读写该 buffer 或原数组可能引发竞态,需自行同步
- 若后续要长期持有 buffer 且不希望影响原数组,应改用
ByteBuffer.allocate(array.length).put(array).flip();创建副本 - 调用
array()可获取底层字节数组(仅对 heap buffer 有效;direct buffer 不支持)
常见误用提醒
避免以下操作:
- 对 wrap 得到的 buffer 调用
clear()后直接get()—— 若未先flip(),position > limit,会抛BufferUnderflowException - 认为 wrap 后的 buffer 是只读的 —— 默认是可读写的;如需只读,用
ByteBuffer.wrap(array).asReadOnlyBuffer() - 在 wrap 后调用
compact()或slice(),虽合法但要注意新视图仍共享原数组
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










