2011-06-14 14 views
6

Quiero leer bytes de un archivo wave en una matriz. Dado que el número de bytes leídos depende del tamaño del archivo de onda, estoy creando una matriz de bytes con un tamaño máximo de 1000000. Pero esto está dando como resultado valores vacíos al final de la matriz. Entonces, quería crear una matriz que aumentara dinámicamente y encontré que ArrayList es la solución. ¡Pero la función read() de la clase AudioInputStream lee bytes solo en una matriz de bytes! ¿Cómo paso los valores en una ArrayList?crear una ArrayList de bytes

+0

¿Cuáles son los próximos pasos que desea hacer con esa matriz de bytes? Quizás ni siquiera necesites ese gran buffer temporal. – pcjuzer

Respuesta

13

Usted puede tener una matriz de bytes como:

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

Para convertir de nuevo a las matrices

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

(A continuación, tendrá que escribir un convertidor para transformar Byte[] a byte[]).

EDIT: está usando el List<Byte> mal, yo sólo voy a mostrar cómo leer AudioInputStream simplemente con ByteArrayOutputStream.

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

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

byte[] soundBytes = baos.toByteArray(); 

PS Un IOException se lanza si frameSize no es igual a 1. Por lo tanto, utilizar una memoria intermedia de bytes a leer los datos, así:

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(); 
+0

*****. Java: 41: no se puede encontrar el símbolo símbolo: método de lectura (java.util.List ) ubicación: clase javax.sound.sampled.AudioInputStream ais.read (buffer); –

+0

Esto no se compila: no hay una forma automática/incorporada para convertir una 'Lista ' en un 'byte []'. Aparte de eso, usar 'List ' es ** terriblemente ** ineficiente en el espacio. –

+0

@Joachim Sauer, tienes razón, olvidé que debe haber una conversión de 'Byte' a byte. Modificar la respuesta. –

17

ArrayList no es la solución, ByteArrayOutputStream es la solución. Cree un ByteArrayOutputStream escriba sus bytes en él, y luego invoque toByteArray() para obtener los bytes.

Ejemplo de lo que su código debe ser similar:

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(); 
4

Algo como esto debería hacer:

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

Lo siento si el código es un poco mal. No he hecho Java por un tiempo.

Además, tenga cuidado si implementa como un while (true) bucle :)

Editar: Y esto es una forma alternativa de hacerlo que lee más bytes cada vez:

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

Tenga en cuenta que ambos métodos read() lanzan una IOException: ¡esto se deja como un ejercicio para el lector!

+0

No debería usar una 'Lista' de' Byte', y leer byte por byte es muy lento. – Kaj

+0

Él quiere una 'Lista' en lugar de una matriz. Además, proporcioné un ejemplo alternativo para leer en trozos. –

+0

él quiere una 'Lista' porque él no sabe el tamaño por adelantado. Esta es la solución correcta, incluso aunque no use una 'Lista'. –