2
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);
}
4

5 回答 5

4

我建议使用 aByteArrayOutputStream而不是 anArrayList<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为空,您将在该错误中编写。)

于 2012-09-06T19:14:00.930 回答
2

在 Apache Commons 中使用ArrayUtils :

byte[] byteArray = ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]));
于 2012-09-06T19:09:30.337 回答
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

于 2012-09-06T18:52:50.230 回答
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

于 2012-09-06T18:48:11.723 回答
1

你总是可以使用类似TByteListfrom的东西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();
于 2012-09-06T18:49:18.173 回答