Подтвердить что ты не робот

Самый сжатый способ вставить массив байтов в List <Byte>?

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

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

Ответ 1

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

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

То есть, в то время как a byte может быть помещен в ячейку byte, a byte[] НЕ ДОПУСКАЕТСЯ автобоксироваться до byte[]!
(также верно для других примитивов)

Итак, у вас есть два варианта:

  • Просто перебирайте каждую byte в byte[] и add отдельно
  • Использовать библиотеки
    • С Apache Commons Lang, вы можете конвертировать byte[] в byte[]
      • Вы можете затем Arrays.asList и addAll
    • С 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 вы можете использовать Byte[] toObject(byte[]) от ArrayUtils:

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

Связанные вопросы

Ответ 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()));

Ответ 4

Вам действительно нужно 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();