Добавление элементов массива в ArrayList - PullRequest
1 голос
/ 18 марта 2012

У меня очень небольшое потоковое приложение, которое собирает небольшие массивы данных в массивы (потому что это звуковые данные, а Java хочет, чтобы это был массив) и пытается поместить их в ArrayList для хранения.Все это, по сути, является передней частью модели «производитель / потребитель».

Проблема: похоже, не работает.

На стороне продюсера у меня есть этот код:

  public synchronized void run() {
// do a whole bunch of audio set-up

try {
  // more audio stuff

  while (true) {
    if (producing) {
      byte[] data = new byte[line.getBufferSize() ];
      numBytesRead = line.read(data, 0, data.length);
      System.out.println("Producer:  Size of dat[] is " + data.length);

      // Save this chunk of data.
      buffer.addData(data);
    }

Это кажется простым, если не считать аудио и бухгалтерию.
В классе буфера у меня есть:

public class Buffer {
  ArrayList list ;
  public void addData(byte[] data) {
    list.addAll(Arrays.asList(data));
  }

Это тоже кажется простым.Вот проблема: если мой массив имеет длину, скажем, 1024, и все элементы там есть (что я и подтвердил), я бы ожидал, что размер ArrayList будет увеличиваться на 1024 при каждом добавлении данных.Это не так.Он увеличивается на 1, как если бы я делал ArrayList of ArrayLists или ArrayList of Arrays, а не Arraylist элементов, которые я желаю.

Я подозреваю, что у меня возникнет эта проблема с обратной стороныа также, где у меня может быть ArrayList в десятки тысяч байтов, и я хочу получить массив первых 1024 элементов.

Не могу помочь, но думаю, что упускаю что-то очень простое.Может кто-нибудь пролить свет на то, почему это не работает?(Или, если есть какой-то принципиально лучший способ сделать то, что я пытаюсь сделать?)

Ответы [ 3 ]

4 голосов
/ 18 марта 2012

Arrays.asList() не выполнит преобразование из byte в Byte, вернет список, содержащий 1 элемент; byte[] вы проходите.

Если ваша цель - добавить Byte объектов для каждого байта, вам придется делать это самостоятельно в цикле. Обратите внимание, что при этом будет использоваться гораздо больше памяти, чем при передаче byte[] с.

Также обратите внимание, что не гарантируется, что даже если во входном потоке останется более чем достаточно данных, вы будете каждый раз читать data.length байт (результат размеров буфера, параллелизма и т. Д.), Поэтому вы рискуете прохождения группы 0 байтов в конце вашего буфера, если вы прочитали меньше байтов, чем просили.

1 голос
/ 18 марта 2012

byte [] данные должны быть Byte [].Вы должны использовать объект, а не примитив.

0 голосов
/ 18 марта 2012

Не могу помочь, но думаю, что упускаю что-то очень простое.Может кто-нибудь пролить свет на то, почему это не работает? (или если есть какой-то принципиально лучший способ сделать то, что я пытаюсь сделать?)

Хранение байтовых данных в ArrayList<Byte> требует много памяти,по сравнению с массивом byte[].Если вы работаете с большим объемом данных, вы можете использовать массив byte[] для хранения данных.Взгляните на исходный код ByteArrayOutputStream - я не знаю, будет ли он работать для вас как есть, но вы можете создать аналогичный класс, который управляет расширяющимся байтовым массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...