2010-07-21 16 views
5

que tiene 40 MB de archivos en el servidor y estoy descargando mi archivo usandoacelerar el tiempo de descarga

HttpURLConnection c = (HttpURLConnection) u.openConnection(); 
c.setRequestMethod("GET"); 
c.setDoOutput(true); 
c.connect(); 
FileOutputStream f = new FileOutputStream(new File("trips.xml")); 


InputStream in = c.getInputStream(); 

byte[] buffer = new byte[1024]; 
int len1 = 0; 
while ((len1 = in.read(buffer)) != -1) { 
    f.write(buffer,0, len1); 

este código parece estar funcionando bien pero está tomando demasiado tiempo. es su forma en que puedo hacer que este proceso sea más rápido.

/minhaz

+0

Solo se puede descargar tan rápido como la conexión más lenta. Si está en acceso telefónico (56K), la optimización no tendrá importancia. Y la conexión más lenta no será necesariamente usted; no es una conexión directa con el servidor, las solicitudes viajan a través de numerosas redes para llegar y regresar. –

Respuesta

2

Este muy feo corte, que poder darle una descarga más rápida de tiempo, o tal vez no lo hace, usted tendrá que probar que bajo sus condiciones:

Start varias conexiones paralelas (en hilos separados?), y cada uno debe descargar un trozo diferente de datos (usando HTTP 1.1 Range header). Dependiendo de muchas cosas como si hay luna llena, o sale el sol o florecen las rosas, es posible que obtengas mejores resultados porque saturará tu enlace mejor que una conexión única (a costa de todos los que comparten tu enlace, algo así como qué hace BitTorrent).

+0

Así es como funcionan normalmente los aceleradores y gestores de descargas. Yo no llamaría a esto un hack feo, lo llamaría una solución bastante buena ;-) –

+0

@Chris OK, creo que esa parte fue realmente subjetiva. Lo arreglaré. – Gianni

+0

@Gianni Supongo que en la perspectiva de todos los demás con los que se supone que compartes el ancho de banda, definitivamente es feo ... ;-) –

3

Utilice una memoria intermedia de entrada mayor que 1 KB. Mientras más rápido vacíe el búfer, la pila de red más rápida puede continuar la descarga. Esto debería ayudar:

byte[] buffer = new byte[50*1024]; 
+1

Esta es la forma más sencilla de obtener un buen aumento en las velocidades de descarga; inicialmente estaba usando un buffer de 1kb, luego 8kb, pero luego probé 50kb e hizo una diferencia significativa. – brack

+0

Solución extremadamente práctica –

1

Estoy teniendo el mismo problema, se me ocurrió este código. Era más rápido que las versiones anteriores que he probado. Especifico un tamaño de búfer mayor que el archivo que voy a descargar. Espero eso ayude.

public String load(String url, int bufferSize){ 

    try { 
     URL myURL = new URL(url); 
     URLConnection ucon = myURL.openConnection(); 
     ucon.setRequestProperty("Connection", "keep-alive"); 
     InputStream inputStream = ucon.getInputStream(); 
     BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
     ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(bufferSize); 
     byte[] buf = new byte[bufferSize]; 
     int read; 
     do { 
      read = bufferedInputStream.read(buf, 0, buf.length); 
      if (read > 0) 
       byteArrayBuffer.append(buf, 0, read); 
     } while (read >= 0); 
     return new String(byteArrayBuffer.toByteArray()); 
    } catch (Exception e) { 
     Log.i("Error", e.toString()); 
    } 
    return null; 
} 
+0

Esto está en la línea correcta, ya que se necesita un tamaño de búfer más grande. Sin embargo, se debe evitar un tamaño de búfer mayor que el tamaño del archivo para archivos de más de un par de megabytes debido a restricciones de memoria en los dispositivos móviles. – brack

Cuestiones relacionadas