2010-07-21 5 views
5

Ich habe 40 MB-Datei im Server und ich bin das Herunterladen meiner DateiSpeed ​​Up Downloadzeit

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); 

dieser Code scheint funktioniert gut mit, aber es dauert zu lange. ist ihre Art, wie ich diesen Prozess schneller machen kann.

/minhaz

+0

Sie können nur so schnell wie die langsamste Verbindung herunterladen. Wenn Sie einwählen (56K), spielt die Optimierung keine Rolle. Und die langsamste Verbindung wird nicht unbedingt du selbst sein - es ist keine direkte Verbindung zum Server, die Anfragen reisen über zahlreiche Netzwerke, um hin und zurück zu kommen. –

Antwort

2

Diese sehr hässlicher Hack, die Macht Sie geben eine schnellere Zeit herunterladen, oder vielleicht ist es nicht, werden Sie es unter Bedingungen testen müssen:

starten mehrere parallele Verbindungen (in separaten Threads?), und jeder sollte einen anderen Datenblock herunterladen (mit HTTP 1.1 Range header). Abhängig von vielen Dingen, wie wenn es einen Vollmond gibt, oder die Sonne draußen ist oder die Rosen blühen, können Sie bessere Ergebnisse erzielen, weil es Ihre Verbindung besser sättigt als eine einzige Verbindung (zu Lasten aller anderen, die Ihre Verbindung teilen, irgendwie was BitTorrent macht).

+0

So funktionieren Download-Beschleuniger und -Manager normalerweise. Ich würde das nicht als hässlichen Hack bezeichnen, ich würde es eine ziemlich gute Lösung nennen ;-) –

+0

@Chris OK, ich denke dieser Teil war wirklich subjektiv. Ich werde das reparieren. – Gianni

+0

@Gianni Ich nehme an, in der Perspektive von allen anderen soll man _sharing_ bandwidth mit sein, es ist definitiv hässlich ... ;-) –

3

Verwenden Sie einen größeren Eingangspuffer als 1 KB. Je schneller Sie den Puffer leeren, desto schneller kann der Netzwerk-Stack heruntergeladen werden. Dies sollte helfen:

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

Dies ist der einfachste Weg, um eine schöne Steigerung der Download-Geschwindigkeiten zu bekommen; Anfangs benutzte ich einen 1kb Puffer, dann 8kb, aber dann versuchte ich 50kb und es machte einen signifikanten Unterschied. – brack

+0

Extrem praktische Lösung –

1

Ich habe das gleiche Problem, kam mit diesem Code. War schneller als vorherige Versionen, die ich versucht habe. Ich gebe eine Puffergröße an, die größer als die Datei ist, die ich herunterladen werde. Ich hoffe es hilft.

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

Dies ist in der richtigen Richtung, da eine größere Puffergröße benötigt wird. Allerdings sollte eine Puffergröße größer als die Dateigröße für Dateien größer als ein paar Megabyte aufgrund von Speicherbeschränkungen auf mobilen Geräten vermieden werden. – brack