事实证明我误解了available()方法实际上做了什么,所以我只是将编写数据的代码改为:
int b = input.read();
while (b != -1) {
output.write(b);
b = input.read();
}
我会再次使用更高效的阅读/写作方法,现在我很高兴我能够正常工作。谢谢你的帮助!
我正在使用Commons-Net库通过FTP与服务器进行交互,当我尝试将文件从服务器下载到本地计算机时,我遇到了一个问题。我不知道这是否是Comment-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();
我对网络很陌生,所以我只是愚蠢而做一些非常简单的错误吗?
答案 0 :(得分:2)
你不应该使用input.available(),因为它只是告诉你有多少输入没有阻塞。循环直到文件结尾(即直到read()返回-1)。
http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#read()
如果效率问题,您也可以尝试一次读取多个字节。
答案 1 :(得分:0)
使用IOUtils
和FileUtils
检查commons-io以简化流处理