简体   繁体   English

Java:转换ArrayList的最佳方法是什么 <Byte> 到byte []?

[英]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> . 你总是可以使用类似TByteListtrove4j ,而不是你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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM