Lectura de archivo binario de URLConnection

Estoy tratando de leer un archivo binario de un URLConnection. Cuando lo pruebo con un archivo de texto parece funcionar bien, pero para los archivos binarios no funciona. Estoy usando el siguiente tipo de mime en el servidor cuando se envía el archivo:

application/octet-stream 

Pero hasta ahora nada parece funcionar. Este es el código que uso para recibir el archivo:

 file = File.createTempFile( "tempfile", ".bin"); file.deleteOnExit(); URL url = new URL( "http://sofes.miximages.com/java/f" ); URLConnection connection = url.openConnection(); BufferedReader input = new BufferedReader( new InputStreamReader( connection.getInputStream() ) ); Writer writer = new OutputStreamWriter( new FileOutputStream( file ) ); int c; while( ( c = input.read() ) != -1 ) { writer.write( (char)c ); } writer.close(); input.close(); 

Así es como lo hago,

 input = connection.getInputStream(); byte[] buffer = new byte[4096]; int n; OutputStream output = new FileOutputStream( file ); while ((n = input.read(buffer)) != -1) { output.write(buffer, 0, n); } output.close(); 

Si intenta leer una secuencia binaria, NO debe envolver el InputStream en un Reader de ningún tipo. Lea los datos en un búfer de matriz de bytes utilizando el método InputStream.read(byte[], int, int) . Luego escriba desde el búfer a FileOutputStream .

La forma en que actualmente está leyendo / escribiendo el archivo lo convertirá en “caracteres” y volverá a los bytes utilizando la encoding de caracteres predeterminada de su plataforma. Esto es susceptible de destruir datos binarios.

(Hay un conjunto de caracteres (LATIN-1) que proporciona un mapeo sin pérdidas de 1 a 1 entre bytes y un subconjunto del espacio de valores de char . Sin embargo, esta es una mala idea incluso cuando la asignación funciona. Usted estará traduciendo / copiando los datos binarios de byte[] a char[] y viceversa … lo que no logra nada en este contexto.)