2012-10-17 44 views
1

我正在學習Java OOP。我的程序通過FTP下載文件。我想在重新啓動時重新開始下載。這裏是我的代碼:如何使用FTP協議恢復讀取InputStream

URL urlName = new URL(url); 
URLConnection con = urlName.openConnection(); 
BufferedInputStream in = new BufferedInputStream(con.getInputStream()); 

int i = 0; 
long downloadedSizeKB; 
System.out.println("before skip"); 
long k = in.skip(counter); 
System.out.println(k); 
byte[] bytesIn = new byte[1024]; 
while ((i = in.read(bytesIn)) >= 0) { 
    if(counter >= alreadyDownloadedBytes) { 
     out.write(bytesIn, 0, i); 
     downloadedSizeKB = counter/1024; 
     downSize.setText(downloadedSizeKB + " KB downloaded..."); 

     while(isPaused) { 
      downSize.setText(downloadedSizeKB + " KB PAUSED"); 
      Thread.sleep(1000);      
     } 
    } 
    counter += i; 
} 

in.close(); 

起初,我試圖儘可能多的閱讀它如以前下載的文件的lenght,然後繼續閱讀並從該點寫。在恢復下載之前讀取文件需要太多時間(比如100MB需要1-2分鐘)。之後,我意識到有一個跳過方法,但我想它做同樣的事情,因爲它需要幾乎相同的時間。

有沒有更快的方式開始從它的特定字節讀取文件?或者我應該以另一種方式來做這件事?或者這是唯一的方法?

+0

看看http://stackoverflow.com/questions/2792963/how-to-resume-an-ftp-download-at-any-point-shell-script-wget-option –

回答

2

您可以使用apache.commons.net.ftp.FTPClient(在commons-net.jar庫中)。

您的方法如下:setRestartOffset(yourOffset),在檢索文件之前使用它,文件數據將從指定的偏移量開始。

0

我還沒有查找FTP的全部細節,但是,在輸入流上跳過只讀取已讀取的字節。你需要做的是告訴服務器只發送你還沒有的字節。

在HTTP和FTP中,這是RANGE標頭。 This question具有如何爲FTP執行此操作的詳細信息。

+0

謝謝,我不'不知道如何將這個範圍頭文件應用到我的java代碼中,但是你給了我一個開始搜索的地方。 –