在某些代码中,我正在创建一个Bytes列表,并希望在构建它时将一个字节数组插入到列表中。这样做最干净的方法是什么?请参阅下面的代码 - 谢谢。
public class ListInsert {
public static byte[] getData() {
return new byte[]{0x01, 0x02, 0x03};
}
public static void main(String[] args) {
final List<Byte> list = new ArrayList<Byte>();
list.add((byte)0xaa);
list.add(getData()); // I want to insert an array of bytes into the list here
list.add((byte)0x55);
}
}
答案 0 :(得分:25)
IF 您有一个Byte[] arr
- 一系列参考类型 - 您可以使用Arrays.asList(arr)
获取List<Byte>
。
IF 您有byte[] arr
- 一系列基元 - 您无法使用Arrays.asList(arr)
来获取List<Byte>
。相反,你会得到一个单元素List<byte[]>
。
也就是说,虽然
byte
可以装箱到Byte
,但byte[]
不会自动装箱到Byte[]
!
(对于其他原语也是如此)
所以你有两个选择:
byte
和byte[]
中的每个add
byte[]
转换为Byte[]
Arrays.asList
和addAll
byte[]
立即转换为List<Byte>
第一个选项如下:
byte[] arr = ...;
for (byte b : arr) {
list.add(b);
}
Guava的第二个选项如下:
// requires Guava
byte[] arr = ...;
list.addAll(Bytes.asList(arr));
这使用Bytes.asList
中的package com.google.common.primitives
。该包还有其他原语的转换实用程序。整个图书馆非常有用。
使用Apache Commons Lang,您可以使用ArrayUtils
中的Byte[] toObject(byte[])
:
// requires Apache Commons Lang
byte[] arr = ...;
list.addAll(Arrays.asList(ArrayUtils.toObject(arr)));
答案 1 :(得分:4)
这可能无法解答您的问题,但这应该是一个很好的做法。如果您正在大量操作字节数组,请改用ByteBuffer。这个类有很多类型的实现,可以给你最好的性能和内存使用情况。其中一个是Direct ByteBuffer,有些操作本身可以运行。
放一个字节或一个字节数组就像吃糖果一样简单:
ByteBuffer.put(byte src);
ByteBuffer.put(byte[] src);
ByteBuffer.put(byte[] src, int offset, int length);
最好的是当你试图获取字节时:直接,不需要数组副本(你需要检查大小):)
byte[] data = ByteBuffer.array();
希望你改变主意:)
答案 2 :(得分:1)
答案 3 :(得分:0)
你真的需要List<Byte>
吗?我也这么认为,但改变了主意。 ByteArrayOutputStream
对我来说好多了。
import java.io.ByteArrayOutputStream;
ByteArrayOutputStream bo = new ByteArrayOutputStream();
// fill in buf or get a single byte b
bo.write(buf, 0, bytesRead);
bo.write(b);
byte[] resultArray = bo.toByteArray();