2010-07-21 3 views
5

ho 40 MB file server e sto scaricando il mio file utilizzandoSpeed ​​Up scaricare tempo

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

questo codice sembra lavorare bene, ma sta prendendo troppo tempo. è il loro modo in cui posso rendere questo processo più veloce.

/minhaz

+0

È possibile scaricare solo la connessione più lenta. Se sei in dialup (56K), l'ottimizzazione non ha importanza. E la connessione più lenta non sarà necessariamente te - non è una connessione diretta al server, le richieste viaggiano su numerose reti per arrivare e tornare indietro. –

risposta

2

Questo molto brutto hack che potrebbe darà un più veloce di scaricare tempo, o forse non lo fa, si dovrà verificare che sotto le condizioni:

Inizio diverse connessioni parallele (in thread separati?), e ognuna dovrebbe scaricare un altro blocco di dati (utilizzando HTTP 1.1 Range header). A seconda di molte cose come se ci fosse una luna piena, o il sole è spento o le rose stanno sbocciando potresti ottenere risultati migliori perché saturerà il tuo link meglio di una singola connessione (a scapito di tutti gli altri che condividono il tuo link, un po 'come cosa fa BitTorrent).

+0

Ecco come funzionano in genere gli acceleratori e i gestori di download. Non lo definirei un brutto trucco, lo definirei una buona soluzione ;-) –

+0

@Chris OK, immagino che quella parte fosse davvero soggettiva. Lo aggiusterò. – Gianni

+0

@Gianni Suppongo che nella prospettiva di tutti gli altri dovresti essere _sharing_ larghezza di banda con, è decisamente brutto ... ;-) –

3

Utilizzare un buffer di input più grande di 1 KB. Più velocemente si svuota il buffer, lo stack di rete più veloce può continuare a scaricare. Questo dovrebbe aiutare:

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

Questo è il modo più semplice per ottenere un buon aumento delle velocità di download; inizialmente stavo usando un buffer da 1kb, poi 8kb, ma poi ho provato 50kb e ha fatto una differenza significativa. – brack

+0

Soluzione estremamente pratica –

1

Sto avendo lo stesso problema, è venuto con questo codice. Era più veloce delle versioni precedenti che ho provato. Specifico una dimensione del buffer maggiore del file che sto per scaricare. Spero che sia d'aiuto.

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

Questa è la linea giusta, in quanto è necessario un buffer di dimensioni maggiori. Tuttavia, si dovrebbe evitare una dimensione del buffer superiore alla dimensione del file per i file più grandi di un paio di megabyte a causa dei vincoli di memoria sui dispositivi mobili. – brack