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);
}
答案 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();