java - tutorial - Lectura de archivo binario de URLConnection
escribir bytes en fichero java (2)
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();
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://somedomain.com/image.gif" );
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();
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 codificación 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.)