我有一个大的byte[]
数组和许多小的byte
数组(大数组的长度是小数组长度之和)。是否有一种快速的方法可以从起始位置到结束位置将一个数组复制到另一个数组,而不是手动使用循环逐字节进行操作?
ByteBuffer
。ByteBuffer target = ByteBuffer.wrap(bigByteArray);
target.put(small1);
target.put(small2);
...;
你还可以应用我之前回答Stack Overflow中提供的解决方法。请注意,对于像byte
这样的基本类型,您需要生成单独的版本(每个基本类型一个版本),因为泛型在那里不起作用。
System.arrayCopy()
弄混了,感到困惑。 - Sean Patrick FloydSystem
的,感觉有点奇怪! - DoriByteArrayOutputStream
(虽然它为你创建了结果数组,而不是像你要求的那样复制到现有数组中)。public byte[] concatenateByteArrays(List<byte[]> blocks) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
for (byte[] b : blocks) {
os.write(b, 0, b.length);
}
return os.toByteArray();
}
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));
}
输出:
快速棕色狐狸
System.arraycopy()
已经会抛出 IndexOutOfBoundsException
异常(而且该异常提供了更多信息)。 - Joachim Sauer这里有另一种解决方案,也使用了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();
}
ByteBuffer.allocate(size)
。然后,在所有target.put()
调用之后,调用target.getArray()
。 - Evgeny Veretennikov