2012-09-06 168 views
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[]。 這是唯一的方法嗎?Java:將ArrayList <Byte>轉換爲byte []的最佳方法是什麼?

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

回答

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

+0

true,這甚至沒有編譯 – daydreamer

+2

OP想要一個byte []而不是Byte [] 「......我猜? –

+0

是的,我希望不需要將字節大小作爲參數傳遞,正如在OP – daydreamer

1

你總是可以使用類似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(); 
+0

這不會起作用,因爲'TByteList'是一個接口。它需要是'TByteList bytes = new TByteArrayList();'。然後它與使用核心'ByteArrayOutputStream'類(這將避免jar依賴)沒有多大區別。 –

+0

@TedHopp:哎呀感謝接口提示。你是對的,在這種情況下使用'BAOS'可能是最佳選擇。作爲OP的問題的一個選項,我有點把它扔進去*「這是唯一的方法嗎?」* –

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

+0

使用ArrayList實現這很好,但它可以在任何鏈表實現上以多項式時間運行。寫入對象數組,然後迭代靜態轉換更安全,因爲保證線性時間。 –

+0

@SamGrondahl - OP正在使用'ArrayList',它不是一個鏈表實現。 –

2

使用ArrayUtils在Apache的百科全書:

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

它使用主要代碼 - 我會打賭。您必須決定是選擇三行代碼還是一行代碼和JAR依賴項。 – duffymo

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(); 

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

相關問題