最简洁的方法是将字节数组插入List <byte>?</byte>

时间:2010-08-20 16:21:24

标签: java list

在某些代码中,我正在创建一个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);
    }
}

4 个答案:

答案 0 :(得分:25)

IF 您有一个Byte[] arr - 一系列参考类型 - 您可以使用Arrays.asList(arr)获取List<Byte>

IF 您有byte[] arr - 一系列基元 - 您无法使用Arrays.asList(arr)来获取List<Byte>。相反,你会得到一个单元素List<byte[]>

  

也就是说,虽然byte可以装箱到Byte,但byte[] 不会自动装箱到Byte[]
  (对于其他原语也是如此)

所以你有两个选择:

  • 只需遍历bytebyte[]中的每个add
  • 使用库
    • 使用Apache Commons Lang,您可以将byte[]转换为Byte[]
      • 您可以然后 Arrays.asListaddAll
    • Guava可以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)

Arrays.asList()方法正是如此:

Arrays.asList(getData());

所以在你的情况下:

list.addAll(Arrays.asList(getData()));

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