2010-04-23 18 views
0

Lors du téléchargement d'un fichier rar sur Internet avec le code ci-dessous, le fichier téléchargé est plus volumineux qu'il ne l'est réellement. Vous ne savez pas ce qui cause cela?Java: problème de téléchargement avec BufferedInputStream, BufferedOutputStream

 bis = new BufferedInputStream(urlConn.getInputStream()); 
     bos = new BufferedOutputStream(new FileOutputStream(outputFile)); 

     eventBus.fireEvent(this, new DownloadStartedEvent(item)); 

     int read; 
     byte[] buffer = new byte[2048]; 
     while ((read = bis.read(buffer)) != -1) { 
      bos.write(buffer); 
     } 

     eventBus.fireEvent(this, new DownloadCompletedEvent(item)); 

Répondre

4

Vous écrivez un tampon plein à la sortie avec chaque écriture, même si l'opération read(byte[]) ne remplit pas complètement.

En outre, puisque vous lisez déjà dans un byte[], les flux tamponnés sont juste des frais généraux contre-productifs. Utilisez des flux tamponnés avec les méthodes mono-octet read() et write().

Voici un meilleur modèle à suivre.

InputStream is = urlConn.getInputStream(); 
try { 
    FileOutputStream os = new FileOutputStream(outputFile); 
    try { 
    byte[] buffer = new byte[2048]; 
    while (true) { 
     int n = is.read(buffer); 
     if (n < 0) 
     break; 
     os.write(buffer, 0, n); 
    } 
    os.flush(); 
    } finally { 
    os.close(); 
    } 
} finally { 
    is.close(); 
} 
2

Essayez d'utiliser l'appel à BufferedOutputStream écriture qui prend une longueur

bos.write(buffer, 0, read)

2

Ne pas réinventer la roue: (! Et débogué) utiliser la bibliothèque Jakarta Commons IO, qui a déjà mis en œuvre ce code . Plus précisément, regardez IOUtils.copy()

Oh oui, comme erickson montre, vous devez fermer vos flux après les avoir utilisés. IOUtils a également une méthode pour le faire.

+0

oui les flux sont fermés dans le bloc finally, mais ne les ont pas collés pour des raisons de concision. En regardant les communs util, très intresting – nkr1pt