2010-12-06 76 views
0

我的下載文件的方法。這有點簡化,我刪除了第三個參數 - DownloadListener,我使用它來通知調用者關於下載進度。如何下載文件並正確處理異常?

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

我猜測,異常沒有被正確處理,但如果我把close()方法調用進入finally塊,他們將不得不通過try-catch塊這會顯得很凌亂包圍。必須有一些更清晰的方式來正確地下載Java文件。另一件事是,我應該撥打connection.disconnect()

回答

4

直到Java 7的ARM。您是對的,那麼您通常需要在finally區塊中嵌套try-finally區塊,以清楚地清理多個資源。如果在線完成,正確的做法看起來不太整齊。

這通常是提取靜態輔助方法(如類似IOUtils.closeConnection())的一個很好的候選方案;該方法可以捕獲任何異常,以避免異常停止進一步的資源關閉。

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

什麼是`Colsable`? – 2010-12-06 10:28:16

2

我的建議是,所使用的每個資源必須在finally區塊中關閉(釋放)。當您打開未關閉的連接並嘗試建立另一個連接並且以前的資源尚未釋放時,您不需要這種情況。

0

將'is'或'fos'放在catch中以使其無法訪問。

+0

請詳細說明。 – 2010-12-06 10:59:43