Pregunta

Estoy tratando de leer un archivo binario remoto (por ejemplo, una imagen) de Internet de esta manera:

HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection(); //myUrl - URL object pointing for some location
if(connection.getResponseCode() == 200){
    File temp = File.createTempFile("blabla", fileName); //fileName - string name of file
    FileOutputStream out = new FileOutputStream(temp);
    int fileSize = Integer.parseInt(connection.getHeaderField("content-length"));
    int counter = 0;
    DataInputStream in = new DataInputStream(connection.getInputStream());
    byte ch[] = new byte[1024];
    System.out.println(counter);
    while((counter += in.read(ch)) > 0){
        out.write(ch);
        if(counter == fileSize){
            out.close();
            break;
        }
    }
}

Localmente con el servidor web local (localhost) funciona perfectamente.

Pero. Entonces myUrl es la URL del archivo en algún servidor web remoto: devuelve resultados inesperados. Por ejemplo, a partir de las fuentes de los archivos dados, parece que repite algunos paquetes (creo que debido a la corrupción de los anteriores o algo) y el archivo resultante generalmente es aproximadamente un 10% más grande que el original debido a esto se repite. Por lo tanto, el archivo está dañado y no se puede abrir correctamente con los visores de imágenes.

¿Cómo puedo resolver esto?

¿Fue útil?

Solución

read no necesariamente lee todo el búfer (especialmente si está al final de la transmisión).

Así que cambia tu ciclo:

for (;;) {
    int len = in.read(ch);
    if (len == -1) {
        break;
    }
    out.write(ch, 0, len);
}

Quizás ponga ese código en un método en alguna parte.

También tenga en cuenta:

  • No tiene sentido usar DataInputStream aquí (aunque readFully a menudo es útil).
  • Siempre cierre el recurso (como las transmisiones) con el idioma habitual:

    final Resource resource = acquire();
    try {
        use(resource);
    } finally {
        resource.close();
    }
    
  • Probablemente no haga mucha diferencia, pero un tamaño de buffer de 1024 es un poco pequeño. Tiendo a usar 8192 de manera arbitraria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top