0

我目前在我的应用程序中为 FTP 客户端使用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 库,那就太好了。

谢谢。

4

2 回答 2

2

你可以只使用java.net.URLConnection一直存在的类。它应该知道如何处理 FTP URL 就好了。 是一个简单的示例,它应该给出您正在寻找的阻塞行为。

需要注意的是,您必须自己管理输入/输出流,但这应该非常简单。

于 2011-08-30T12:38:46.650 回答
0

好的,简要回答一下,以免让可能看到此问题的人感到困惑。
是的,用于 FTP 的commons-net正在像我想象的那样工作,也就是说,retrieveFile() 方法会阻塞,直到下载完成。
(当然)是我自己在代码中的“错误”让我不这么认为。

于 2011-11-11T15:49:38.787 回答