我目前使用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
我不熟悉那个库,但它似乎应该给你一些方法来处理异常,而不是静静地写空文件... –