【问题标题】:Is it possible to create ByteBuffer from a List<ByteBuffer>?是否可以从 List<ByteBuffer> 创建 ByteBuffer?
【发布时间】:2017-05-17 18:35:18
【问题描述】:

假设我有一个 list/arrayList 或一个 ByteBuffers 数组(List&lt;ByteBuffer&gt;ByteBuffer[]

是否可以直接从上述数组中获取字节,而无需遍历所有项目或计算它们的总大小?我正在寻找这样的东西:

ByteBuffer[] bufferList = new ByteBuffer[7]; //this can be any kind of list of ByteBuffers
//add items to the array
ByteBuffer buffer = (ByteBuffer) bufferList; //what i want to achieve  

当然最后一行是不正确的。

问题是我已经在数组中按顺序排列了所有字节,但我希望它们不再在列表中,而是在单个 ByteBuffer 中。那么有什么东西可以从 ByteBuffers 的列表/数组中创建一个 ByteBuffer 吗?

谢谢!

【问题讨论】:

  • 您在数组或列表中有单独的 ByteBuffer 元素,每个元素都有 X 字节,您想将所有这些字节添加到单个 ByteBuffer
  • 你可能只需要为它编写一个方法。
  • 创建一个新的 ByteBuffer,遍历你的缓冲区数组,使用 .array() 将每个 bytebuffer 作为一个数组,然后使用 put(byte[]) 进入你的新 ByteBuffer
  • 是的@SotiriosDelimanolis。我有一个具有不同字节大小的 ByteBuffer 列表,我想从中创建一个 ByteBuffer。

标签: java arrays bytearray bytebuffer


【解决方案1】:
public ByteBuffer convertToOne(ByteBuffer[] src)
{
    int size=0;
    for(int i = 0 ; i < src.length ; i++) {
        size+=src[i].array().length;
    }

    ByteBuffer newBuffer = ByteBuffer.allocate(size);

    int sizeAt = 0;
    for(int i = 0 ; i < src.length ; i++) {
        newBuffer.put(src[i].array(), sizeAt);
        sizeAt += src[i].array().length;
    }
    return newBuffer;
}

【讨论】:

  • 这个解决方案的问题是我必须进行另一次迭代来计算元素的总字节大小。 (ByteBuffer 项没有固定大小)所以问题是我如何初始化最终的 ByteBuffer(在这种情况下为 newBuffer)。
  • 如何初始化原始缓冲区?我假设你有一个具体的类。
  • 那么我如何创建'ByteBuffer dest'?在放入东西之前我不必分配大小吗?
  • 没有办法。如果java有一种方法可以做到这一点,无论如何都会通过这样做来实现。本机 Java 方法并不神奇。
  • 只有一种方法可以通过指定大小来创建 ByteBuffer。此外,没有返回不同大小的 ByteBuffer 的 ByteBuffer 方法。因此,您需要先计算大小。
【解决方案2】:

我相信您将不得不创建一个新的ByteBuffer 并将bufferList 中的每个缓冲区复制到新的缓冲区中。您应该将此功能放在一个方法中,以免每次使用时都重复代码。

【讨论】:

  • 是的。我知道我可以做到这一点。但这将需要遍历所有 ByteBuffer 以计算它们的总大小,然后创建大 ByteBuffer,然后再次进行交互以添加它们。如果可能的话,我正在寻找更优化的东西。
  • 迭代集合所花费的时间只是创建大字节缓冲区和复制其他字节缓冲区所花费的时间的一小部分。无论如何,任何内置函数都很可能会这样做。
  • 问题是..我正在尝试创建一个序列化程序,所以最后我需要一个 ByteBuffer 而不是 ByteBuffers 列表。这就是为什么我想将 BB 列表转换为单个 BB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多