У меня есть один большой массив byte[]
и множество небольших массивов byte
(длина большого массива - это сумма длин небольших массивов). Может быть, есть какой-то быстрый способ скопировать один массив в другой от начальной позиции до конца, а не использовать для цикла для каждого байта вручную?
Скопируйте несколько байтовых массивов в один большой массив байтов
Ответ 1
Вы можете использовать ByteBuffer
.
ByteBuffer target = ByteBuffer.wrap(bigByteArray);
target.put(small1);
target.put(small2);
...;
Ответ 2
Используйте System.arraycopy()
.
Вы также можете применить решение из предыдущего моего ответа. Обратите внимание, что для примитивных типов, таких как byte
, вам придется создавать отдельные версии (по одному для каждого примитивного типа), поскольку дженерики там не работают.
Ответ 3
Или вы можете использовать ByteArrayOutputStream
(Хотя он создает результирующий массив для вас, а не копирует в существующий массив, как вы просили).
public byte[] concatenateByteArrays(List<byte[]> blocks) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
for (byte[] b : blocks) {
os.write(b, 0, b.length);
}
return os.toByteArray();
}
Ответ 4
Пример реализации
public static void copySmallArraysToBigArray(final byte[][] smallArrays,
final byte[] bigArray){
int currentOffset = 0;
for(final byte[] currentArray : smallArrays){
System.arraycopy(
currentArray, 0,
bigArray, currentOffset,
currentArray.length
);
currentOffset += currentArray.length;
}
}
Тестовый код
public static void main(final String[] args){
final byte[][] smallArrays =
{
"The" .getBytes(),
" Quick" .getBytes(),
" Brown" .getBytes(),
" Fox" .getBytes()
};
final byte[] bigArray = "The Small Mauve Cat".getBytes();
copySmallArraysToBigArray(smallArrays, bigArray);
System.out.println(new String(bigArray));
}
Вывод:
Быстрая коричневая лисица
Ответ 5
Вот еще одно решение, которое также использует ByteBuffer
:
public static byte[] toByteArray(List<byte[]> bytesList)
{
int size = 0;
for (byte[] bytes : bytesList)
{
size += bytes.length;
}
ByteBuffer byteBuffer = ByteBuffer.allocate(size);
for (byte[] bytes : bytesList)
{
byteBuffer.put(bytes);
}
return byteBuffer.array();
}