【问题标题】:Most concise way to insert array of bytes into List<Byte>?将字节数组插入 List<Byte> 的最简洁方法?
【发布时间】:2010-08-20 16:21:23
【问题描述】:

在某些代码中,我正在创建一个字节列表,并希望在构建它时将一个字节数组插入到列表中。这样做最干净的方法是什么?请参阅下面的代码 - 谢谢。

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

【问题讨论】:

  • 下面的答案很好,但我很好奇你打算用你的字节列表做什么......
  • 这是我正在使用的设备,需要从串口发送某些消息包。
  • 使用列表 是处理串行通信的一种非常低效的方法。您应该围绕字节数组编写自己的类似列表的包装器,或者使用 java.nio 中的字节缓冲区。

标签: java list


【解决方案1】:

如果你有一个Byte[] arr——一个引用类型的数组——你可以使用Arrays.asList(arr)来获得一个List&lt;Byte&gt;

如果你有一个byte[] arr——一个基元数组——你不能使用Arrays.asList(arr)来得到一个List&lt;Byte&gt;。相反,您将获得一个单一元素 List&lt;byte[]&gt;

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

所以你有两个选择:

  • 只需逐个迭代 byte[]add 中的每个 byte
  • 使用库
    • 使用Apache Commons Lang,您可以将byte[] 转换为Byte[]
      • 你可以那么Arrays.asListaddAll
    • 使用Guava 可以立即将byte[] 转换为List&lt;Byte&gt;

第一个选项如下所示:

byte[] arr = ...;
for (byte b : arr) {
    list.add(b);
}

Guava 的第二个选项如下所示:

// requires Guava
byte[] arr = ...;
list.addAll(Bytes.asList(arr));

这使用来自package com.google.common.primitivesBytes.asList。该软件包还具有其他原语的其他转换实用程序。整个库非常有用。

使用 Apache Commons Lang,您可以使用来自ArrayUtilsByte[] toObject(byte[])

// requires Apache Commons Lang
byte[] arr = ...;
list.addAll(Arrays.asList(ArrayUtils.toObject(arr)));

相关问题

【讨论】:

  • 谢谢,之前没看过google原语包,现在去看看。
【解决方案2】:

这可能无法回答您的问题,但应该是一个好习惯。如果您正在大量操作字节数组,请改用 ByteBuffer。这个类有许多类型的实现,可以给你最好的性能和内存使用。其中之一是 Direct ByteBuffer,一些操作可以在本地运行。

放一个字节或一个字节数组就像吃糖果一样简单:

ByteBuffer.put(byte src);
ByteBuffer.put(byte[] src);
ByteBuffer.put(byte[] src, int offset, int length);

最好的事情是当您尝试获取字节时:直接,不需要数组副本(尽管您需要检查大小):)

byte[] data = ByteBuffer.array();

希望你改变主意:)

【讨论】:

    【解决方案3】:

    Arrays.asList() 方法正是这样做的:

    Arrays.asList(getData());
    

    所以在你的情况下:

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

    【讨论】:

    • 这不适用于byte[]Arrays.asList 不适用于基元数组。
    • 我认为自动装箱会处理这个问题,但我想那时不是数组
    【解决方案4】:

    你真的需要List&lt;Byte&gt;吗?我也这么认为,但改变了主意。 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();
    

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2011-04-04
      • 2010-09-29
      • 2011-11-04
      相关资源
      最近更新 更多