1

解决了

原来我误解了 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();

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

4

2 回答 2

2

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

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

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

于 2011-07-14T12:38:27.060 回答
0

查看 commons-ioIOUtilsFileUtils更简单的流处理

于 2011-07-14T12:37:48.543 回答