我目前使用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庫,這將是很好的。
謝謝。
感謝您的建議,我也會研究這一點,但我想我發現了什麼讓我感到困惑。無論此函數拋出的異常,我傳遞給retrieveFile()函數的輸出流都將被刷新並關閉。所以無論如何我都會得到空文件。我將簡單地通過嘗試下載一些大文件來測試它,看它是否在調試器中被阻塞。 – Less
我不熟悉那個庫,但它似乎應該給你一些方法來處理異常,而不是靜靜地寫空文件... –