создать ArrayList байтов - PullRequest
7 голосов
/ 14 июня 2011

Я хочу прочитать байты из волнового файла в массив.Поскольку число прочитанных байтов зависит от размера файла волны, я создаю байтовый массив с максимальным размером 1000000. Но это приводит к пустым значениям в конце массива.Итак, я хотел создать динамически растущий массив и обнаружил, что ArrayList является решением.Но функция read () класса AudioInputStream считывает байты только в байтовый массив!Как вместо этого передать значения в ArrayList?

Ответы [ 3 ]

24 голосов
/ 14 июня 2011

ArrayList не является решением, ByteArrayOutputStream является решением.Создайте ByteArrayOutputStream запись ваших байтов в него, а затем вызовите toByteArray(), чтобы получить байты.

Пример того, как должен выглядеть ваш код:

in = new BufferedInputStream(inputStream, 1024*32);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] dataBuffer = new byte[1024 * 16];
int size = 0;
while ((size = in.read(dataBuffer)) != -1) {
    out.write(dataBuffer, 0, size);
}
byte[] bytes = out.toByteArray();
15 голосов
/ 14 июня 2011

У вас может быть массив байтов, такой как:

List<Byte> arrays = new ArrayList<Byte>();

Чтобы преобразовать его обратно в массивы

Byte[] soundBytes = arrays.toArray(new Byte[arrays.size()]);

(Затем вам нужно написать преобразователь для преобразования Byte[] to byte[]).

РЕДАКТИРОВАТЬ: Вы используете List<Byte> неправильно, я просто покажу вам, как читать AudioInputStream просто с ByteArrayOutputStream.

AudioInputStream ais = ....;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;

while((read = ais.read()) != -1) {
    baos.write(read);
}

byte[] soundBytes = baos.toByteArray();

PS IOException выбрасывается, если frameSize не равно 1.Следовательно, используйте байтовый буфер для чтения данных, например:

AudioInputStream ais = ....;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;

while((bytesRead = ais.read(buffer)) != -1) {
    baos.write(buffer, 0, bytesRead);
}

byte[] soundBytes = baos.toByteArray();
4 голосов
/ 14 июня 2011

Примерно так должно поступить:

List<Byte> myBytes = new ArrayList<Byte>();

//assuming your javax.sound.sampled.AudioInputStream is called ais

while(true) {
  Byte b = ais.read();
  if (b != -1) { //read() returns -1 when the end of the stream is reached
    myBytes.add(b);
  } else {
    break;
  }
}

Извините, если код немного неправильный. Я давно не занимался Java.

Кроме того, будьте осторожны, если вы реализуете его как цикл while (true):)

Редактировать: И вот альтернативный способ сделать это, каждый раз читая больше байтов:

int arrayLength = 1024;
List<Byte> myBytes = new ArrayList<Byte>();

while(true) {

  Byte[] aBytes = new Byte[arrayLength];
  int length = ais.read(aBytes); //length is the number of bytes read

  if (length == -1) {  //read() returns -1 when the end of the stream is reached
    break; //or return if you implement this as a method
  } else if (length == arrayLength) {  //Array is full
    myBytes.addAll(aBytes);
  } else {  //Array has been filled up to length

    for (int i = 0; i < length; i++) {
      myBytes.add(aBytes[i]);
    }
  }
}

Обратите внимание, что оба метода read () выдают IOException - обработка этого оставлена ​​как упражнение для читателя!

...