【问题标题】:Commons-Net FTPClient is not downloading files correctlyCommons-Net FTPClient 没有正确下载文件
【发布时间】:2011-07-14 12:35:45
【问题描述】:

已解决

原来我误解了 available() 方法的实际作用,所以我只是修改了将数据写入到这里的代码:

int b = input.read();
while (b != -1) {
    output.write(b);
    b = input.read();
}

下次我会研究一种更有效的阅读/写作方法,现在我很高兴我能成功。感谢您的帮助!

原帖

我正在使用 Commons-Net 库通过 FTP 与服务器交互,当我尝试将文件从服务器下载到本地计算机时遇到了问题。我不知道这是否是 Comments-Net.FTPClient 中的错误,但很有可能我没有正确使用该库。也就是说,当我用谷歌搜索问题时,我无法找到解决方案,并且我看到的示例代码似乎使用与我相同的方法来下载文件。

无论如何,实际问题是下载的一些文件完全是空的,而它们应该包含数据。它是随机发生的,所以每次我下载所有文件时,不同的文件最终都是空的。我假设我从服务器读取数据或将其写入文件的方式存在问题。

代码如下:

// For each file
InputStream input = ftp.retrieveFileStream(sourcePath);
ftp.completePendingCommand();

OutputStream output = new FileOutputStream(new File(destinationPath));
while (input.available() > 0) {
    output.write(input.read());
}

input.close();
output.close();

我对网络还很陌生,所以我只是很傻,做一些非常简单的错误吗?

【问题讨论】:

    标签: java ftp download corrupt-data apache-commons-net


    【解决方案1】:

    您不应该使用 input.available() ,因为它只会告诉您有多少输入可用而不会阻塞。循环直到文件结束(即直到 read() 返回 -1)。

    http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()

    如果效率是一个问题,您也可以尝试一次读取多个字节。

    【讨论】:

    • 啊,问题解决了!我想我会犯这样的愚蠢错误。我不应该假设 available() 返回流中剩余的字节数。感谢您的帮助!
    【解决方案2】:

    使用 IOUtilsFileUtils 查看 commons-io 以获得更简单的流处理

    【讨论】:

    • 如果我在读取/关闭返回的 InputStream 后尝试将 ftp.completePendingCommand() 放在任何地方,它总是无法完全读取以后的文件,返回 null 而不是另一个 InputStream。我最初认为这也是问题,但每当我移动它时,由于上述问题,它只是想出了一个 NullPointerError。
    • 好的。我认为您应该考虑 Paul Cager 的回答。我也遇到了input.available() 的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2012-03-21
    • 2023-04-05
    • 2015-01-17
    • 2013-04-24
    • 2012-09-30
    • 2011-08-30
    相关资源
    最近更新 更多