Java:将ArrayList <byte>转换为byte []?</byte>的最佳方法是什么?

时间:2012-09-06 18:45:53

标签: java

ArrayList<Byte> bytes = new ArrayList<Byte>();
try {
    int data = putObjectRequest.getInputStream().read();
    bytes.add((byte) data);
    while (data != -1) {
        data = putObjectRequest.getInputStream().read();
        bytes.add((byte)data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

我想将其转换为byte[]。 这是唯一的方法吗?

byte[] byteArray = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
   byteArray[i] = bytes.get(i);
}

5 个答案:

答案 0 :(得分:4)

我建议您使用ByteArrayOutputStream代替ArrayList<Byte>来收集您的意见:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
    int data = putObjectRequest.getInputStream().read();
    while (data != -1) {
        bos.write(data);
        data = putObjectRequest.getInputStream().read();
    }
} catch (IOException e) {
    e.printStackTrace();
}
byte[] byteArray = bos.toByteArray();

这避免了拳击和拆箱每个字节的可怕开销。 (我还修复了原始代码中的一个小错误,如果-1为空,您可以在其中写putObjectRequest。)

答案 1 :(得分:2)

byte[] byteArray = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
   byteArray[i] = bytes.get(i);
}

是的,这是唯一的方法。

byte[] byteArray = bytes.toArray(new byte[bytes.size()]);

使用另一个答案中提出的toArray() 有效,因为该方法无法自动将包装类型Byte转换为原始byte。< / p>

答案 2 :(得分:2)

在Apache Commons中使用ArrayUtils

byte[] byteArray = ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]));

答案 3 :(得分:1)

不。更容易:

Byte[] byteArray = bytes.toArray(new Byte[bytes.size()]);

如果你真的想要原语:

byte[] primitives = new byte[byteArray.length]
for (int i = 0; i < byteArray.length; i++) {
  primitives [i] = (byte)byteArray[i];
}

这可以保证链表和调整大小数组实现的线性时间复杂度。

自5.0以来一直受到支持:

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray(T [])

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html

答案 4 :(得分:1)

您可以始终使用TByteList中的trove4j而不是ArrayList<Byte>。您的算法将成为:

TByteList bytes = new TByteArrayList();
try {
    int data = putObjectRequest.getInputStream().read();
    bytes.add((byte) data);
    while (data != -1) {
        data = putObjectRequest.getInputStream().read();
        bytes.add((byte)data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

byte[] byteArray = bytes.toArray();