我有一个大byte[]
数组和许多小byte
数组(大数组的长度是小数组的长度之和)。是否有一些快速的方法可以将一个数组从开始位置复制到另一个数组,而不是手动为每个字节使用for循环?
答案 0 :(得分:59)
您可以使用ByteBuffer
。
ByteBuffer target = ByteBuffer.wrap(bigByteArray);
target.put(small1);
target.put(small2);
...;
答案 1 :(得分:22)
您还可以应用a previous answer of mine中的解决方案。请注意,对于诸如byte
之类的基本类型,您必须生成单独的版本(每种基本类型一个版本),因为泛型在那里不起作用。
答案 2 :(得分:13)
或者您可以使用ByteArrayOutputStream
(虽然它会为您创建结果数组,而不是按照您的要求复制到现有数组中。)
public byte[] concatenateByteArrays(List<byte[]> blocks) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
for (byte[] b : blocks) {
os.write(b, 0, b.length);
}
return os.toByteArray();
}
答案 3 :(得分:6)
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));
}
<强>输出:强>
快速布朗狐狸
答案 4 :(得分:2)
这是另一个也使用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();
}