在java中阻止(同步)ftp下载?

在java中阻止(同步)ftp下载?,java,ftp,apache-commons-net,Java,Ftp,Apache Commons Net,我目前正在我的应用程序中使用commons net library for FTP客户端。我必须根据文件名的一些标准从远程服务器下载一些文件。这是我实际代码的一个非常简化和简化的版本(因为我做了一些检查并捕获了所有可能的异常),但本质是: //ftp is FTPClient object //... files = ftp.listFiles(); for (FTPFile ftpFile : files) { String name = ftpFile.getName();

我目前正在我的应用程序中使用commons net library for 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()返回以下文档:

如果成功完成,则为True,否则为false

我需要的是序列化下载,因为我需要记录每一次不成功的下载。
我在commons net源代码中看到的是,如果我没有错的话,将为每个retrieveFile()调用创建新的套接字

我对此相当困惑,所以如果有人能解释实际发生的情况,并提供此库的解决方案,或者推荐其他支持阻止每个文件下载的FTP java库,那就太好了

谢谢。

你可以使用一直存在的课程。它应该知道如何处理FTP URL。是一个简单的示例,它应该给出您正在寻找的阻塞行为


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

好的,简单回答一下,以免混淆可能看到此问题的人。
是的,commons net for FTP正在按我所想的那样工作,也就是说,retrieveFile()方法会阻止,直到下载完成。

(当然)是我自己在代码中的“错误”让我产生了相反的想法

谢谢你的建议,我也会调查一下,但我想我发现了什么让我困惑。我传递给retrieveFile()函数的输出流正在刷新和关闭,而不管该函数引发了什么异常。所以不管发生什么,我都会得到空文件。我将通过下载一些大文件来测试它,看看它是否会在调试器中阻塞。我不熟悉这个库,但它似乎应该为您提供一些处理异常的方法,而不是默默地编写空文件。。。