列出<byte []>到单字节[] </byte []>

时间:2013-08-16 15:20:23

标签: java

List<byte[]> listOfByteArrays;

我希望通过附加byte[]中的所有元素,将此List中存储的所有byte[]添加到一个List。我知道一种方法,那就是使用System.arrayCopy(),但在循环中使用它会有点混乱(temporary variables and byte[] arrays)。试图找到一种更好的方法,但不能。有什么指针吗?我可以使用任何外部API吗?

5 个答案:

答案 0 :(得分:11)

尝试使用ByteArrayOutputStream

ByteArrayOutputStream out= new ByteArrayOutputStream( );

循环

out.write(eachBytearray);

循环后

byte result[] = out.toByteArray( );

答案 1 :(得分:6)

为什么需要临时数组?

  • 在列表中进行一次传递,将各个数组的长度相加。
  • 创建一个足以容纳所有
  • 的单个数组
  • 在列表中进行第二次传递,使用System.arraycopy将数组从列表复制到目标数组中的适当位置。 (显然,您需要跟踪目标数组中的偏移量。)

答案 2 :(得分:5)

Guava的单行:

Bytes.concat(listOfByteArray.toArray(new byte[0][]));

或稍长一点(在较短版本中,toArray内部发生一个字节数组分配)

Bytes.concat(listOfByteArray.toArray(new byte[listOfByteArray.size()][]));

答案 3 :(得分:3)

这很容易从头开始写:

int length = 0;
for (byte[] ba : listOfByteArrays) {
    length += ba.length
}


byte[] total = new byte[length];

int index = 0;
for (byte[] ba : listOfByteArrays) {
    for (byte b : ba) {
        total[index++] = b;
    }
}

total是所需的字节数组。

答案 4 :(得分:0)

我会循环列表并总结列表中数组的长度。创建一个包含所有内容的byte []。使用System.arrayCopy()循环并复制到适当的索引中。

我认为第三方图书馆不仅仅是因为您所描述的内容。

您似乎知道如何对其进行编码,因此我将省略示例代码。