2010-12-06 5 views
0

Ma méthode de téléchargement de fichier. C'est un peu simplifié, j'ai supprimé le troisième argument - DownloadListener, que j'utilise pour informer l'appelant de la progression de dowonload.Comment télécharger un fichier et gérer correctement les exceptions?

public static boolean downloadFile(String url, File file) { 
    try { 
     HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
     connection.connect(); 

     FileOutputStream fos = new FileOutputStream(file); 
     InputStream is = connection.getInputStream(); 

     byte[] buffer = new byte[1024]; 
     int len = 0; 
     while ((len = is.read(buffer)) > 0) { 
      fos.write(buffer, 0, len); 
     } 

     is.close(); 
     fos.flush(); 
     fos.close(); 
     return true; 
    } catch (IOException e) { 
     if (file.exists()) 
      file.delete(); 
     return false; 
    } 
} 

Je suppose que les exceptions ne sont pas traitées correctement mais si je mets la fin() remet en bloc finally, ils devraient être entouré par bloc try-catch qui serait très en désordre. Il doit y avoir une manière plus propre de télécharger correctement le fichier en Java. Une autre chose est, devrais-je appeler connection.disconnect()?

Répondre

4

Pas jusqu'au Java ARM. Vous avez raison, vous avez souvent besoin de blocs try-finally imbriqués dans un bloc finally, afin de nettoyer définitivement plusieurs ressources. Et que la façon correcte de le faire ne semble pas très bien rangé si elle est faite en ligne.

Ceci est souvent un bon candidat pour extraire une méthode d'aide statique (comme quelque chose comme IOUtils.closeConnection()); la méthode peut intercepter n'importe quelle exception, afin d'éviter une exception empêchant la fermeture d'autres ressources.

1
 FileOutputStream fos = null; 
    InputStream is = null; 
    try { 
      HttpURLConnection connection = 
        (HttpURLConnection) new URL(url).openConnection(); 
      connection.connect(); 

      fos = new FileOutputStream(file); 

      is = = connection.getInputStream(); 

      byte[] buffer = new byte[1024]; 
      int len = 0; 
      while ((len = is.read(buffer)) > 0) { 
       fos.write(buffer, 0, len); 
      } 


      return true; 
     } catch (IOException e) { 
      if (file.exists()) 
       file.delete(); 
      return false; 
     }finally{ 
      myClose(is); 
      myFlush(fos); 
      myClose(fos); 

    }  } 

    public void myClose(Closable c){ 
     if(c == null) 
     return; 
     try{ 
     c.close(); 
     }catch(IOException ex) 
     //perform necessary things 
     } 
    } 
    public void myFlush(Flushable f){ 
     if(f == null) 
     return; 
     try{ 
     f.flush(); 
     }catch(IOException ex) 
     //perform necessary things 
    } 
+1

qu'est-ce que 'Colsable'? –

2

Ma suggestion est que toutes les ressources utilisées doivent être fermées (libérées) dans le bloc finally. Vous ne voulez pas de situations lorsque vous avez une connexion ouverte qui n'est pas fermée et que vous essayez d'établir une autre connexion et que la ressource précédente n'a pas encore été publiée.

0

Mettre 'is' ou 'fos' pour fermer() dans catch le rend inaccessible.

+0

élaborer s'il vous plaît. –

+0

Si vous ajoutez is.close() et fos.close() à la clause catch(), cela rendrait la variable 'is' et 'fos' inaccessible. J'ai compilé les codes avec les instructions inaccessibles dans mes netbeans et voici ce qu'il montre: "/ home /../ Main.java:111: ne peut pas trouver le symbole symbole: variable est emplacement: class test.Main is.close(); /home/../Main.java:112: ne peut pas trouver le symbole symbole: variable fos emplacement: classe test.Main fos.close(); 2 erreurs " – thotheolh

Questions connexes