2012-07-25 16 views
5

Cuando intento descargar un archivo (en este caso es solo una imagen pero la aplicación real es un mecanismo de actualización), el InputStream parece congelarse en read. Estoy bastante seguro de que mi código está bien, así que me pregunto por qué sucede esto y si solo está en mi computadora. ¿Alguien podría correr esto? Tenga en cuenta que el Timer es simplemente para fines de depuración.Descargando archivos usando Java se congela aleatoriamente

Gracias amablemente.

Aquí hay un video que muestra el problema: Video

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.*; 
import java.net.URL; 
import javax.swing.Timer; 

public class FileDownloader { 

    public final static int BUFFER_LENGTH = 1 << 14; 

    private static Timer timeoutTimer = new Timer(5000, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Timeout"); 
      System.exit(0); 
     } 
    }); 

    public static void main(String [] args) throws Exception{ 
     URL url = new URL("http://host.trivialbeing.org/up/tdk-aug3-jokr-high-res-2.jpg"); 
     download(url, new File("joker.jpg")); 
    } 

    public static void download(final URL url, final File dest) throws IOException { 
     FileOutputStream fos = new FileOutputStream(dest); 
     BufferedOutputStream out = new BufferedOutputStream(fos); 
     BufferedInputStream in = new BufferedInputStream(url.openStream()); 
     byte[] buf = new byte[BUFFER_LENGTH]; 
     int bytesRead; 
     int bytesWritten = 0; 
     timeoutTimer.start(); 
     while ((bytesRead = in.read(buf, 0, BUFFER_LENGTH)) != -1) { 
      timeoutTimer.restart(); 
      out.write(buf, 0, bytesRead); 
      out.flush(); 
      bytesWritten += bytesRead; 
      System.out.println(bytesWritten/1024 + " kb written"); 
     } 
     in.close(); 
     out.close(); 

     System.out.println("Finished"); 
     fos.close(); 
    } 
} 
+0

Lo ejecuté 10 veces seguidas, sin problemas. –

+0

Acabo de probar el código en mi sistema y no tuve problemas para descargar el comodín :). Esto está en XUbuntu 12.4 con IcedTea 6 JRE. Lo único que se me ocurre es descargar la secuencia de salida en el ciclo, pero no veo cómo esto podría cambiar nada. – bchurchill

+0

Lo intentaré. Sin embargo, ¡se congela casi cada vez que lo intento! – rtheunissen

Respuesta

5

El problema que se enfrentan es causada por Java 7 - en detalle que da a IPv6 una prioridad mayor que IPv4.

Puede cambiarlo de nuevo a IPv4 ya que fue utilizado en Java 6 mediante el establecimiento de la propiedad del sistema System.setProperty("java.net.preferIPv4Stack", "true");

Este problema afecta a todo el software basado en Java, pero sólo se produce en algunos equipos (puede depender de la conexión a Internet se utiliza) : Downloads stops - “TCP Window Full”

0

OK, creo que es un sistema lento o por el tipo que respondió arriba de mí (Robert creo) , pero usar ipv6 va a ser difícil si ya no tiene mucho sobre ipv4.

Just a coincedence Me llamo Robert :)

Cuestiones relacionadas