如何从ByteBuffer中提取已使用的字节数组?求一行代码实现方案
一行代码解决ByteBuffer仅发送已使用部分的问题
当然有一行代码的解决方案,分两种场景给你说明:
如果你需要先提取出仅包含已使用数据的字节数组:
byte[] usedData = java.util.Arrays.copyOfRange(oldBuffer.array(), 0, oldBuffer.position());这里
oldBuffer.position()就是你写入数据后的位置,代表已使用的字节数,copyOfRange会直接从原数组中截取0到该位置的部分,得到仅包含有效数据的新数组。如果你不想额外复制数组(更高效),直接用ByteBuffer的内置方法配合发送API:
yourSendChannel.write(oldBuffer.flip());调用
flip()会把缓冲区的limit设置为当前position(已使用数据的末尾),同时把position重置为0,这样后续的write操作就只会读取从0到原position的有效数据,完全符合你的需求,而且避免了数组复制的开销。
注意:如果你的ByteBuffer是直接缓冲区(用
allocateDirect()创建的),调用array()会抛出UnsupportedOperationException,这时候第二种方案(用flip())是更通用安全的选择。
内容的提问来源于stack exchange,提问作者flash
相关产品推荐
相关产品推荐

