2011-08-30 59 views
0

我目前使用commons-net圖書館的FTP客戶端在我的應用程序。我必須從遠程服務器下載一些文件,通過一些基於文件名的標準。這是我的實際代碼非常簡單和簡化版本(因爲我做一些檢查和捕獲所有可能的例外),但本質上是存在的:在java中阻塞(同步)ftp下載?

//ftp is FTPClient object 
//... 
files = ftp.listFiles(); 
for (FTPFile ftpFile : files) { 
    String name = ftpFile.getName(); 
    if(conformsCriteria(name)) { 

     String path = outDirectory + File.separatorChar + name; 
     os = new FileOutputStream(path); 

     ftp.retrieveFile(name, os); 
    } 
} 

現在,我注意到的是,當我運行這段代碼,等待幾秒鐘,然後插上網線,輸出目錄包含一些「空」文件加上實際下載的文件,這使我相信這種方法有點異步工作......但是,然後再次下載一些文件(大小> 0KB),並有這些空文件(大小= 0KB),這導致我相信它仍然是序列化下載...此外,功能retrieveFile()返回,我引用文檔:

如果不是

我需要的是系列化下載,因爲我需要登錄每個不成功下載真要是成功completetd,假的。
只見通過公網瀏覽源是什麼,如果我沒有錯,爲每個retrieveFile()調用創建新的Socket。

我很困惑這一點,所以如果有人能解釋什麼是實際發生的事情,並與該庫提供的解決方案,或建議,支持阻塞每個文件下載一些其他的FTP Java庫,這將是很好的。

謝謝。

回答

0

好的,簡單地回答一下,以免混淆可能會看到這個問題的人。
是的,commons-net對於FTP正在工作,因爲我認爲它會,也就是retrieveFile()方法,直到它完成下載。
這是(當然)我自己在代碼中的「錯誤」,讓我以其他方式思考。

2

您可以使用永遠存在的java.net.URLConnection類。它應該知道如何處理FTP URL很好。 Here是一個簡單的例子,應該給你正在尋找的阻塞行爲。

需要注意的是,您必須自己管理輸入/輸出流,但這應該非常簡單。

+0

感謝您的建議,我也會研究這一點,但我想我發現了什麼讓我感到困惑。無論此函數拋出的異常,我傳遞給retrieveFile()函數的輸出流都將被刷新並關閉。所以無論如何我都會得到空文件。我將簡單地通過嘗試下載一些大文件來測試它,看它是否在調試器中被阻塞。 – Less

+0

我不熟悉那個庫,但它似乎應該給你一些方法來處理異常,而不是靜靜地寫空文件... –