如何从ByteBuffer获取使用过的byte []

时间:2015-02-01 05:47:38

标签: java bytebuffer

java.nio.ByteBuffer类有一个ByteBuffer.array()方法,但这会返回一个数组,该数组是缓冲区容量的大小,而不是已用容量。因此,我遇到了很多问题。

我注意到使用ByteBuffer.remaining()给了我缓冲区当前正在使用的字节数,所以基本上我正在寻找的只是获得byte[]的方法正在使用的字节。 (即ByteBuffer.remaining()中显示的字节。

我尝试了一些不同的东西,但我似乎失败了,唯一的解决方法我可以想到用剩余缓冲区的分配大小创建另一个ByteBuffer,然后写(x)字节它。

2 个答案:

答案 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