从服务器下载文件冻结应用程序并失去连接

时间:2014-09-19 08:16:30

标签: android download fileoutputstream

我试图用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。

可能导致本地文件权限问题吗?

任何人都可以帮助我吗?

3 个答案:

答案 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命令,它列出当前目录中的文件。您必须列出这些文件并分别下载它们。