2010-04-23 114 views
1

在我的应用程序中,我从服务器上下载了几个关键文件,并且我想编写一些代码来处理文件下载因为某种原因而未完成的情况,以便重试在下一次启动。然而,一次下载文件的功能只会抛出MalformedURLException和IOException,但是如果抛出这些异常,这意味着下载甚至没有开始。我应该如何安排事情,以便即使开始下载失败的情况,我也可以处理这种情况?下载文件异常处理

void download(String file) throws MalformedURLException ,IOException 
{ 

     BufferedInputStream getit = new BufferedInputStream(new URL(file).openStream()); 
     FileOutputStream saveit = new FileOutputStream(DOWNLOAD_PATH+fileName+"."+ZIP_EXTENSION); 
     BufferedOutputStream bout = new BufferedOutputStream(saveit,1024); 
     byte data[] = new byte[1024]; 
     int readed = getit.read(data,0,1024); 
     while(readed != -1) 
     { 
      bout.write(data,0,readed); 
      readed = getit.read(data,0,1024); 
     } 
     bout.close(); 
     getit.close(); 
     saveit.close(); 

} 
+1

你写的下载功能,还是从现有的图书馆看看InterruptedIOExceptionbytesTransferred? – Ash 2010-04-23 09:46:09

+0

这是我的自定义下载功能 – rantravee 2010-04-23 09:49:55

回答

1

如果下载是同步的,你应该能够增加一个适当的异常(或返回一个适当的值)来表示失败。

如果您的下载是异步的,请考虑使用observer pattern。您可以将观察者实现作为额外参数传递给您的下载方法。

你的情况(例如)观察员可能看起来像:

public interface FileDownloadObserver 
{ 
    public void downloadFailed(String file, Object error); 
    public void downloadSucceeded(String file); 
} 

然后下载方法看起来像:

void download(String file, FileDownloadObserver observer) 
    throws MalformedURLException, IOException 

这一切都是假设你实际上可以检测出下载失败。如果没有,您可能需要提供更多关于您如何进行下载的信息。

+0

下载是同步的。我编辑了下载功能 – rantravee 2010-04-23 10:24:17

+0

我想你可以将任何问题(除了现有的例外)解释为“下载失败”,并定义“下载失败”例外。或者使用@ josek的建议。 (另外,你是不是存储/返回任何下载的数据,因为它只是你方法的一个例子?) – Ash 2010-04-23 11:42:10

2

使用Jakarta Commons HttpClient API可能会更好。

但是,对于您的自定义函数取http://java.sun.com/j2se/1.4.2/docs/api/java/io/InterruptedIOException.html

public class InterruptedIOException 
extends IOException 

Signals that an I/O operation has been interrupted. 

The field bytesTransferred indicates how many bytes were successfully transferred before the interruption occurred.