2013-08-27 5 views
1

Скажем, у меня есть список/ArrayList или массив ByteBuffers (List<ByteBuffer> или ByteBuffer[])Возможно ли создать 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. Итак, есть ли что-то, что позволяет создать ByteBuffer из списка/массива ByteBuffers?

Спасибо!

+0

У вас есть отдельные элементы ByteBuffer в массиве или списке, каждый из которых имеет X-байты, и вы хотите добавить все эти байты в один «ByteBuffer»? –

+0

Вероятно, вам просто нужно написать метод для этого. – Cruncher

+2

Создайте новый ByteBuffer, пройдите по массиву буферов, получите каждый bytebuffer как массив с использованием .array() и используйте 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

Да. Я знаю, что могу сделать это. но для этого потребуется перебрать все байтовые буферы, чтобы вычислить их общий размер, а затем создать большой ByteBuffer, а interate снова добавить их. Я искал что-то более оптимальное, если это возможно. – dianap

+0

Итерация над сборкой займет немного времени, создавая большой ByteBuffer и копируя другой ByteBuffers. Любая встроенная функция, скорее всего, будет делать это в любом случае. – Jeremy

+0

проблема в том, что я пытаюсь создать сериализатор, поэтому в конце мне нужен один ByteBuffer, а не список ByteBuffers. Вот почему я хочу преобразовать список BB в один BB – dianap

Смежные вопросы