簡體   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();
}

我想將其轉換為byte[] 這是唯一的方法嗎?

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

我建議使用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();

這避免了拳擊和拆箱每個字節的可怕開銷。 (我還修復了原始代碼中的一個小錯誤,如果putObjectRequest為空,則會寫入-1 。)

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

在Apache Commons中使用ArrayUtils

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

不。 更輕松:

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

你總是可以使用類似TByteListtrove4j ,而不是你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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM