我目前正在我的应用中为客户端使用 commons-net 库。我必须根据文件名的某些标准从远程服务器下载一些文件。这是我的实际代码的一个非常简化和简化的版本(因为我做了一些检查并捕获了所有可能的异常),但其实质是:
//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()返回,我引用文档:
如果成功完成则为真,否则为假
我需要的是序列化下载,因为我需要记录每次不成功的下载。
我看到通过commons-net源浏览的是,如果我没有错,则为每个 retrieveFile()调用创建新的Socket。
我对此非常困惑,所以如果有人能解释实际发生的事情,并提供这个库的解决方案,或者推荐一些支持每个文件阻止下载的其他FTP java库,那就太好了。
感谢。
答案 0 :(得分:2)
您可以使用永远存在的java.net.URLConnection
类。它应该知道如何处理FTP URL就好了。 Here是一个简单的示例,应该提供您正在寻找的阻止行为。
需要注意的是,您必须自己管理输入/输出流,但这应该非常简单。
答案 1 :(得分:0)
好的,简单回答一下,以免混淆那些可能会看到这个问题的人
是的,FTP的 commons-net 正如我所想的那样工作,即retrieveFile()方法阻止,直到完成下载。
它(当然)是我自己的错误"在代码中让我思考不然。