【问题标题】:blocking (synchronous) ftp download in java?在java中阻塞(同步)ftp下载?
【发布时间】:2011-08-30 12:21:18
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java ftp apache-commons-net


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的建议,我也会对此进行调查,但我想我发现了让我感到困惑的地方。我传递给retrieveFile() 函数的输出流正在被刷新和关闭,而不管此函数引发的异常。所以无论如何我都会得到空文件。我将通过尝试下载一些大文件来测试它,看看它是否在调试器中阻塞。
    • 我不熟悉那个库,但它似乎应该给你一些处理异常的方法,而不是默默地写空文件......
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2018-04-06
      • 2016-07-14
      • 2019-10-10
      • 2023-03-14
      • 2013-07-20
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多