【问题标题】:How to obtain used byte[] from ByteBuffer如何从 ByteBuffer 中获取已使用的 byte[]
【发布时间】:2015-02-01 05:47:38
【问题描述】:

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

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

我尝试了一些不同的方法,但似乎都失败了,我能想到的唯一解决方法是使用分配的剩余缓冲区大小创建另一个 ByteBuffer,然后向其中写入 (x) 个字节.

【问题讨论】:

    标签: java bytebuffer


    【解决方案1】:

    从阅读Javadocs 开始,我认为剩余只会为您提供当前位置和限制之间的字节数。

    剩余()

    返回当前位置和限制之间的元素数量。

    此外:

    缓冲区的容量是它包含的元素数量。缓冲区的容量永远不会是负数,也永远不会改变。

    缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会是负数,也永远不会大于其容量。

    缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不会是负数,也永远不会超过其限制。

    所以考虑到这一切如何:

    static byte[] getByteArray(ByteBuffer bb) {
        byte[] ba = new byte[bb.limit()];
        bb.get(ba);
        return ba;
    }
    

    这使用了ByteBuffer的get(byte[] dst)方法

    公共字节缓冲区获取(字节[] dst)

    相对批量获取方法。 此方法将此缓冲区中的字节传输到给定的目标数组中。 src.get(a) 形式的此方法的调用与调用的行为方式完全相同

     src.get(a, 0, a.length) 
    

    【讨论】:

    • 这个有bug,你要bb.rewind();在 bb.get(ba) 之前;声明,否则这将抛出 BufferUnderflowException。即,如果缓冲区中剩余的字节数少于满足请求所需的字节数,也就是说,如果 length > remaining(),则不传输任何字节并抛出 BufferUnderflowException
    【解决方案2】:

    如有必要,分配一个byte[],然后使用ByteBuffer.get(byte[])ByteBuffer.get(byte[], int, int) 方法将字节复制到数组中。根据ByteBuffer 的状态,您可能需要先flip

    在某些情况下,还可以获得ByteBuffer 的支持数组,但不推荐 ...

    更多详情,javadocs 是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多