2011-08-30 151 views
0

我目前使用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库,这将是很好的。

谢谢。

回答

0

好的,简单地回答一下,以免混淆可能会看到这个问题的人。
是的,commons-net对于FTP正在工作,因为我认为它会,也就是retrieveFile()方法,直到它完成下载。
这是(当然)我自己在代码中的“错误”,让我以其他方式思考。

2

您可以使用永远存在的java.net.URLConnection类。它应该知道如何处理FTP URL很好。 Here是一个简单的例子,应该给你正在寻找的阻塞行为。

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

+0

感谢您的建议,我也会研究这一点,但我想我发现了什么让我感到困惑。无论此函数抛出的异常,我传递给retrieveFile()函数的输出流都将被刷新并关闭。所以无论如何我都会得到空文件。我将简单地通过尝试下载一些大文件来测试它,看它是否在调试器中被阻塞。 – Less

+0

我不熟悉那个库,但它似乎应该给你一些方法来处理异常,而不是静静地写空文件... –