【发布时间】:2011-01-28 11:19:30
【问题描述】:
我有一个大的byte[] 数组和很多小的byte 数组(大数组的长度是小数组的长度之和)。是否有一些快速的方法可以将一个数组从起始位置复制到另一个数组,而不是手动为每个字节使用 for 循环?
【问题讨论】:
我有一个大的byte[] 数组和很多小的byte 数组(大数组的长度是小数组的长度之和)。是否有一些快速的方法可以将一个数组从起始位置复制到另一个数组,而不是手动为每个字节使用 for 循环?
【问题讨论】:
您可以使用ByteBuffer。
ByteBuffer target = ByteBuffer.wrap(bigByteArray);
target.put(small1);
target.put(small2);
...;
【讨论】:
ByteBuffer.allocate(size),如果你需要给定size的数组,但还没有。然后,在所有 target.put() 调用之后调用 target.getArray()。
您也可以应用来自a previous answer of mine 的解决方案。请注意,对于 byte 这样的原始类型,您必须生成单独的版本(每种原始类型一个),因为泛型在那里不起作用。
【讨论】:
Arrays.copyOf() 需要Object。
System.arrayCopy()混淆了
System 方法!
或者您可以使用ByteArrayOutputStream(尽管它会为您创建结果数组,而不是按照您的要求复制到现有数组中)。
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(并且该异常也提供了更多信息) .
这是另一个同样使用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();
}
【讨论】: