java.nio.ByteBuffer
类有一个ByteBuffer.array()
方法,但这会返回一个数组,该数组是缓冲区容量的大小,而不是已用容量。因此,我遇到了很多问题。
我注意到使用ByteBuffer.remaining()
给了我缓冲区当前正在使用的字节数,所以基本上我正在寻找的只是获得byte[]
的方法正在使用的字节。 (即ByteBuffer.remaining()
中显示的字节。
我尝试了一些不同的东西,但我似乎失败了,唯一的解决方法我可以想到用剩余缓冲区的分配大小创建另一个ByteBuffer
,然后写(x)字节它。
答案 0 :(得分:4)
从阅读Javadocs开始,我认为只剩下当前位置和限制之间的字节数。
剩余的()
返回当前位置和限制之间的元素数。
此外:
缓冲区的容量是它包含的元素数量。缓冲区的容量永远不会消极,永远不会改变。
缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会超过其容量。
缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不会消极,并且永远不会超过其限制。
所有这一切都是如此:
static byte[] getByteArray(ByteBuffer bb) {
byte[] ba = new byte[bb.limit()];
bb.get(ba);
return ba;
}
这使用了ByteBuffer的get(byte[] dst)
方法
public ByteBuffer get(byte [] dst)
相对批量获取方法。 此方法将字节从此缓冲区传输到给定的目标数组。调用src.get(a)形式的此方法的行为与调用的方式完全相同
src.get(a, 0, a.length)
答案 1 :(得分:0)
如有必要,请分配byte[]
,然后使用ByteBuffer.get(byte[])
或ByteBuffer.get(byte[], int, int)
方法将字节复制到数组中。根据{{1}}的状态,您可能需要首先ByteBuffer
。
在某些情况下,也可能获得flip
的支持数组,但不推荐 ......
有关详细信息,javadoc是here。