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[]。これが唯一の方法ですか?

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

5 に答える 5

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(また、元のコードでifputObjectRequestが空の場合に記述していた小さなバグも修正しました。)

于 2012-09-06T19:14:00.930 に答える
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()別の回答で提案されているように使用しても機能しません。Bytebyte

于 2012-09-06T18:52:50.230 に答える
2

Apache Commons でArrayUtilsを使用する:

byte[] byteArray = ArrayUtils.toPrimitive(bytes.toArray(new Byte[bytes.size()]));
于 2012-09-06T19:09:30.337 に答える
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

于 2012-09-06T18:48:11.723 に答える
1

の代わりにTByteListfromのようなものをいつでも使用できます。アルゴリズムは次のようになります。trove4jArrayList<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();
于 2012-09-06T18:49:18.173 に答える