如何下载文件并正确处理异常?

时间:2010-12-06 10:21:36

标签: java

我下载文件的方法。它有点简化,我删除了第三个参数 - 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 个答案:

答案 0 :(得分:4)

直到Java 7 ARM。你是对的,通常你需要try-finally块中的嵌套finally块,以便最终清理多个资源。如果在线完成,正确的做法并不是很整洁。

这通常是提取静态辅助方法(例如IOUtils.closeConnection()之类的东西)的理想选择;该方法可以捕获任何异常,以避免异常停止进一步关闭资源。

答案 1 :(得分:2)

我的建议是,必须在finally块中关闭(释放)所使用的每个资源。如果您没有关闭打开的连接并尝试建立另一个连接并且尚未释放先前的资源,则您不希望出现这种情况。

答案 2 :(得分: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
   }

答案 3 :(得分:0)

将'is'或'fos'置于catch中的close()使其无法访问。