我试图用FTPClient
(commons-net-3.3)从FTP服务器下载一些文件。
单击带有AsyncTask的按钮时,我会得到一个FTPFile
的{{1}}列表。然后我像这样下载每个列表文件(所有工作在同一个AsyncTask中)
listFiles(path);
特别是FileOutputStream desFileStream = new FileOutputStream("localfile");
InputStream input = mFTPClient.retrieveFileStream("remotepath");
byte data[] = new byte[512];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
Double porcentaje = ((double) total / (double) tmpFiled.getSize()) * 100;
publishProgress((int) Math.round(porcentaje));
desFileStream.write(data, 0, count);
}
desFileStream.flush();
desFileStream.close();
input.close();
}}
。这必须读取1024个字节,但在随机迭代中读取的数据少于1024,写入并在下一次迭代中input.read(data)
冻结下载返回timedout异常
之后,dispositive的互联网连接不起作用
Logcat显示此异常
input.read(data)
例如在摩托罗拉Moto G中,从未发生过其他决定因素。我试过两个ftpservers。
可能导致本地文件权限问题吗?
任何人都可以帮助我吗?
答案 0 :(得分:1)
我做了很少的搜索并试试;
FileOutputStream desFileStream = new FileOutputStream("localfile");
mFTPClient.setFileType(FTP.BINARY_FILE_TYPE); // File type can be changed
boolean status = mFTPClient.retrieveFile("remotepath",desFileStream);
答案 1 :(得分:1)
我认为您的错误可能是由多个活动的下载连接引起的,这会使您的网络连接饱和。并生成超时异常。它应该解释你错误的随机特征。为避免这种情况,我认为你必须限制同时下载的数量。
在Google上进行了一些搜索之后,我也进行了(即使我认为不是你的情况),并且#34;连接超时"错误在冰淇淋三明治和早期可能与DNS双缓存有关。见Issue
答案 2 :(得分:0)
特别是在input.read(data)中。这必须读取1024字节,但在随机迭代中读取的数据少于1024
不,不是“必须”。以下是Java doc sais:
int read(byte[] b)
从输入流中读取一些字节数并将它们存储到缓冲区数组b中。
此函数读取缓冲区大小的数据,而不是那个大小。
InputStream input = mFTPClient.retrieveFileStream(“remotepath”);
什么是“remotepath”?
它是文件,还是目录?
如果它是一个文件,问题出现在行input.close();
中,因为在第一次迭代中读取了几个字节后,关闭流然后尝试在第二次迭代时从闭合流中读取(就像评论中已经说过的那样。)
如果它是一个目录,那么你就不能像你想要的那样下载它。 FTP协议中有一个LIST命令,它列出当前目录中的文件。您必须列出这些文件并分别下载它们。