2010-07-21 6 views
5

J'ai fichier 40 Mo dans le serveur et je télécharge mon fichier en utilisantSpeed ​​Up Temps de téléchargement

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

ce code semble fonctionner très bien, mais il prend trop de temps. est de toute façon que je peux faire ce processus plus rapidement.

/minhaz

+0

Vous pouvez uniquement télécharger aussi vite que la connexion la plus lente. Si vous êtes connecté (56K), l'optimisation n'aura aucune importance. Et la connexion la plus lente ne sera pas nécessairement vous - ce n'est pas une connexion directe au serveur, les demandes voyagent sur de nombreux réseaux pour y aller et revenir. –

Répondre

2

Ce bidouille laid qui pourrait vous donner un temps plus rapide de télécharger, ou peut-être ne pas, vous devrez le tester sous vos conditions:

Démarrer plusieurs connexions parallèles (dans des threads séparés?), et chacun devrait télécharger un morceau différent de données (en utilisant HTTP 1.1 Range header). Selon beaucoup de choses comme s'il y a une pleine lune, ou que le soleil est éteint ou que les roses fleurissent, vous obtiendrez de meilleurs résultats car il saturera votre lien mieux qu'une seule connexion (au détriment de tout le monde partageant votre lien, un peu comme ce que BitTorrent fait).

+0

Voici comment fonctionnent généralement les accélérateurs de téléchargement et les gestionnaires. Je n'appellerais pas cela un hack laid, je dirais que c'est une bonne solution ;-) –

+0

@Chris OK, je suppose que cette partie était vraiment subjective. Je vais arranger ça. – Gianni

+0

@Gianni Je suppose que dans la perspective de tout le monde, vous êtes censé être _sharing_ bande passante avec, c'est définitivement moche ... ;-) –

3

Utilisez un tampon d'entrée plus grand que 1 Ko. Plus vite vous videz le tampon, plus la pile réseau peut continuer à télécharger. Cela devrait aider:

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

Ceci est le moyen le plus simple d'obtenir une belle augmentation sur les vitesses de téléchargement; Au début, j'utilisais un buffer de 1kb, puis 8kb, mais ensuite j'ai essayé 50kb et cela a fait une différence significative. – brack

+0

Solution extrêmement pratique –

1

Je suis le même problème, est venu avec ce code. Était plus rapide que les versions précédentes, j'ai essayé. Je spécifie une taille de tampon supérieure au fichier que je vais charger. J'espère que cela aide.

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

Ceci est dans le bon sens, en ce sens qu'une plus grande taille de tampon est nécessaire. Cependant, il faut éviter une taille de tampon supérieure à la taille du fichier pour les fichiers supérieurs à quelques mégaoctets en raison de contraintes de mémoire sur les périphériques mobiles. – brack

Questions connexes