2013-08-27 43 views
1

比方说,我有一个列表/数组列表或字节缓冲区(List<ByteBuffer>ByteBuffer[])的阵列是否可以从List <ByteBuffer>创建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?

谢谢!

+0

您在数组或列表中有单独的'ByteBuffer'元素,每个元素都有X个字节,并且您想将所有这些字节添加到一个'ByteBuffer'? –

+0

你可能只需要为它编写一个方法。 – Cruncher

+2

创建一个新的ByteBuffer,迭代你的缓冲区数组,使用.array()将每个bytebuffer获取为一个数组,并将put(byte [])用于新的ByteBuffer – Cruncher

回答

4
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; 
} 
+0

这个解决方案的问题在于我必须进行另一次迭代才能计算元素的总字节大小。 (ByteBuffer项没有固定大小)所以问题是我如何初始化最终的ByteBuffer(在这种情况下是newBuffer)。 – dianap

+0

如何初始化原始缓冲区?我假设你有一个具体的课。 – Cruncher

+0

那我该如何创建'ByteBuffer dest'?在把东西放进去之前,我不需要分配大小吗? – dianap

0

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

+0

是的。我知道我可以做到这一点。但是这需要遍历所有的ByteBuffers来计算它们的总大小,然后创建大的ByteBuffer,并重新添加它们。如果可能的话,我正在寻找更适合的东西。 – dianap

+0

迭代集合将需要一小部分时间来创建大型ByteBuffer并复制其他ByteBuffers。无论如何,任何内置函数都很可能会这样做。 – Jeremy

+0

问题是..我试图创建一个序列化器,所以最后我需要一个ByteBuffer而不是一个ByteBuffers列表。这就是为什么我想要将BB列表转换为单个BB – dianap