Самый краткий способ вставить массив байтов в List ?

В каком-то коде я создаю список байтов и хочу вставить массив байтов в список по мере его создания. Какой самый чистый способ сделать это? См. Код ниже - спасибо.

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);
    }
}
16
задан stacker 20 August 2010 в 16:56
поделиться

3 ответа

ЕСЛИ у вас есть Byte[] arr -- массив ссылочных типов -- вы можете использовать Arrays.asList(arr), чтобы получить List.

ЕСЛИ у вас есть byte[] arr -- массив примитивов -- вы не можете использовать Arrays.asList(arr) для получения List. Вместо этого вы получите одноэлементный List.

То есть, если байт может быть автобоксирован в байт, то байт[] НЕ автобоксируется в байт[]!
(также верно для других примитивов)

Поэтому у вас есть два варианта:

  • Просто перебрать каждый байт в байт[] и добавить по отдельности
  • Использовать библиотеки.
    • С помощью Apache Commons Lang вы можете преобразовать byte[] в Byte[]
      • Вы можете затем Массивы. asList и addAll
    • С помощью Guava можно сразу преобразовать byte[] в List

Первый вариант выглядит так:

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

Второй вариант с Guava выглядит так:

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

Здесь используется Bytes. asList из пакета com.google.common.primitives. В пакете есть и другие утилиты преобразования для других примитивов. Вся библиотека очень полезна.

С Apache Commons Lang вы можете использовать Byte[] toObject(byte[]) из ArrayUtils:

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

Похожие вопросы

26
ответ дан 30 November 2019 в 17:38
поделиться

Есть Arrays.asList () метод, который именно это делает:

Arrays.asList(getData());

Итак, в вашем случае:

list.addAll(Arrays.asList(getData()));
1
ответ дан 30 November 2019 в 17:38
поделиться

Это может не ответить на ваш вопрос, но это должно быть хорошей практикой. Если вы сильно манипулируете массивом байтов, используйте вместо этого ByteBuffer. Этот класс имеет множество типов реализации, которые могут дать вам лучшую производительность и использование памяти. Одним из них является Direct ByteBuffer, который некоторые операции могут запускаться изначально.

Поместить байт или массив байтов так же просто, как съесть конфету:

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

И лучше всего, когда вы пытаетесь получить байты: напрямую, копия массива не требуется (вам нужно проверить размер хотя):)

byte[] data = ByteBuffer.array();

Надеюсь, вы передумали :)

4
ответ дан 30 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: