[英]Java: what is the best way to convert ArrayList<Byte> to byte[]?
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();
}
I want to convert this to byte[]
. 我想将其转换为
byte[]
。 is this this the only way? 这是唯一的方法吗?
byte[] byteArray = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
byteArray[i] = bytes.get(i);
}
I'd suggest using a ByteArrayOutputStream
instead of an ArrayList<Byte>
to collect your input: 我建议使用
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();
This avoids the horrible overhead of boxing and unboxing every byte. 这避免了拳击和拆箱每个字节的可怕开销。 (I also fixed a small bug in your original code where you would write
-1
if putObjectRequest
was empty.) (我还修复了原始代码中的一个小错误,如果
putObjectRequest
为空,则会写入-1
。)
byte[] byteArray = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
byteArray[i] = bytes.get(i);
}
Yes, this is the only way. 是的,这是唯一的方法。
byte[] byteArray = bytes.toArray(new byte[bytes.size()]);
Using toArray()
as proposed in another answer does not work because the method can't automatically convert the wrapper type Byte
to the primitive byte
. 使用
toArray()
作为另一个答案建议不起作用,因为该方法不能自动包装类型转换Byte
的原始byte
。
在Apache Commons中使用ArrayUtils :
byte[] byteArray = ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]));
Nope. 不。 Easier:
更轻松:
Byte[] byteArray = bytes.toArray(new Byte[bytes.size()]);
And if you really want primitives: 如果你真的想要原语:
byte[] primitives = new byte[byteArray.length]
for (int i = 0; i < byteArray.length; i++) {
primitives [i] = (byte)byteArray[i];
}
This guarantees you linear time complexity for both linked list and resizing array implementations. 这可以保证链表和调整大小数组实现的线性时间复杂度。
It's been supported since 5.0: 从5.0开始支持它:
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray(T[]) 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/6/docs/api/java/util/ArrayList.html
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html
You could always use something like TByteList
from trove4j
, instead of your ArrayList<Byte>
. 你总是可以使用类似
TByteList
从trove4j
,而不是你ArrayList<Byte>
。 Your algorithm would then become: 您的算法将变为:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.