2010-04-23 115 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.