2010-12-06 13 views
0

私のファイルのダウンロード方法。これは少し単純ですが、私は3番目の引数 - DownloadListenerを削除しました。これは呼び出し側にdowonloadの進行状況を通知するために使用します。ファイルをダウンロードして例外を正しく処理する方法は?

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

(私は例外が正しく処理されていないことを推測するが、私は近くに置く場合は)finallyブロックを呼び出し、彼らは非常に厄介になりますtry-catchブロックで囲まなければならないであろう。 Javaでファイルを正しくダウンロードするには、よりクリーンな方法が必要です。もう1つのことは、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」とは何ですか? –

2

私の提案は、利用されているすべてのリソースをfinallyブロックでクローズ(リリース)する必要があるということです。閉じていない接続があり、別の接続を確立しようとしているときに、以前のリソースがまだ解放されていない状況は望ましくありません。

0

catchで 'is'または 'fos'を閉じる()と到達できなくなります。

+0

を整えてください。 –

+0

is.close()とfos.close()をcatch()句に追加すると、 'is'と 'fos'変数が到達不能になります。 "/ home /../ Main.java:111:シンボルが見つからない シンボル:変数は 場所:クラスtest.Main is.close (); /home/../Main.java:112:シンボルを見つけることができません シンボル:変数fos 場所:クラスtest.Main fos.close(); 2エラー " – thotheolh