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
Respuesta
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();
*****. Java: 41: no se puede encontrar el símbolo símbolo: método de lectura (java.util.List
Esto no se compila: no hay una forma automática/incorporada para convertir una 'Lista
@Joachim Sauer, tienes razón, olvidé que debe haber una conversión de 'Byte' a byte. Modificar la respuesta. –
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();
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!
No debería usar una 'Lista' de' Byte', y leer byte por byte es muy lento. – Kaj
Él quiere una 'Lista' en lugar de una matriz. Además, proporcioné un ejemplo alternativo para leer en trozos. –
é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'. –
- 1. cómo crear sincronizada ArrayList
- 2. bytes Convertir [] para ArrayList <Object>
- 3. ¿Cómo crear una ArrayList desde una matriz en PowerShell?
- 4. ¿Cómo puedo cortar una ArrayList de una ArrayList en Java?
- 5. ¿Cómo crear una matriz de 20 bytes aleatorios?
- 6. Cómo crear una matriz de bytes desde HttpPostedFile
- 7. Crear PrivateKey desde la matriz de bytes
- 8. La mejor manera de crear un hashmap de arraylist
- 9. 8192 bytes al crear el archivo
- 10. Restando un arrayList de otro arrayList
- 11. Java: convertir la lista de bytes en una matriz de bytes
- 12. ¿Cómo puedo crear una ArrayList con un índice inicial de 1 (en lugar de 0)
- 13. Eliminando los primeros 16 bytes de una matriz de bytes
- 14. Imprimir una cadena de ArrayList of String []?
- 15. usando parte de una matriz de bytes
- 16. deserializar una matriz de bytes
- 17. Java ArrayList of Arrays?
- 18. C#, DataTable a ArrayList?
- 19. Cómo dividir una matriz de bytes
- 20. Lists.newArrayList vs new ArrayList
- 21. Convertir una matriz de bytes a una clase que contiene una matriz de bytes en C#
- 22. ¡No use ArrayList!
- 23. Uso de ArrayList o HashMap
- 24. Polimorfismo: ¿Por qué usar "List list = new ArrayList" en lugar de "ArrayList list = new ArrayList"?
- 25. ArrayList BinarySearch
- 26. Java: ordenar una ArrayList en su lugar
- 27. Convierte una doble matriz para doblar ArrayList
- 28. Ordenar una base ArrayList en múltiples atributos
- 29. Capacidad de ArrayList
- 30. serialización de Java ArrayList
¿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