java mp3 inputstream a byte array?

antes de decir “Google”, lo intenté, encontré algunos artículos interesantes, pero nada funcionó.

Necesito convertir un archivo mp3 de un sitio web a un flujo de bytes, que luego puedo guardar en un archivo localmente.

Aquí está mi código (partes más importantes):

Url url = new Url("someUrl"); URLConnection conn = url.openConnection(); byte[] result = inputStreamToByteArray(conn.getInputStream()); // .... some code here byteArrayToFile(result, "tmp.mp3"); public byte[] inputStreamToByteArray(InputStream inStream){ InputStreamReader in = new InputStreamReader(inStream): ByteArrayOutputStream baos = new ByteArrayOutputStream(); int next = inStream.read(); while (next > -1){ baos.write(next); next = in.read(); } byte[] result = baos.toByteArray(); baos.flush(); in.close(); return result; } public void byteArrayToFile(byte[] byteArray, String outFilePath){ FileOutputStream fos = new FileOutputStream(outFilePath); fos.write(byteArray); fos.close() } 

El código se comstack sin errores. La conexión a la url es válida. Envía la respuesta correcta.

El problema está en algún lugar de la conversión. También obtengo el nuevo archivo en el disco, después de byteArrayToFile (), con la longitud adecuada, pero no puedo reproducirlo en ningún reproductor. Dice longitud 00:00 y no jugará.

Por cierto Me gustaría evitar libs de terceros. Pero si nada más funciona …

(El código que presentó no se comstackría sin errores, por cierto. No tiene el manejo de excepciones requerido, y inputStream debería ser InputStream , solo para empezar).

Este es el problema:

 InputStreamReader in = new InputStreamReader(inStream): 

Estás intentando leer un flujo binario y convertirlo en texto. No es texto. No debe usar nada que tenga que ver con “Reader” o “Writer” para datos binarios como un archivo MP3.

Este es el inputStreamToByteArray que debería tener su método inputStreamToByteArray (o use Guava y su método ByteStreams.toByteArray ):

 public byte[] inputStreamToByteArray(InputStream inStream) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = inStream.read(buffer)) > 0) { baos.write(buffer, 0, bytesRead); } return baos.toByteArray(); } 

Tenga en cuenta que lo he dejado para que la persona que llama limpie el flujo de entrada. Normalmente, quienquiera que busque el flujo también lo cierra, sería un poco extraño que un método como este lo cerrara por sí mismo, OMI. Puede hacerlo si lo desea, pero probablemente en un bloque finally , así sabría que siempre se cerraría incluso si se lanzara una excepción.

Tenga en cuenta que su código de “escritura” más adelante tampoco cerrará el archivo si hay una excepción. Debes adquirir el hábito de siempre cerrar arroyos en bloques finally .