如何使用多线程通过FTP下载文件?

时间:2011-12-25 12:10:53

标签: java android

我有以下任务:制作Android程序,用于从FTP服务器(300兆字节)下载1,000个文件。现在我已经制作了一个解析文件树并将其下载到SDCard的程序。但这需要很长时间(40分钟),而且不好,我需要减少下载时间。正在使用代码下载文件:

BufferedOutputStream buffIn=new BufferedOutputStream(new FileOutputStream(f));
mClient.retrieveFile(ftpFile.getName(), buffIn);
buffIn.close();

但是我如何使用多线程呢?我使用apache-commons库,FTPClient类。我不认为我应该将下载代码复制到Thread中,它对我有所帮助。请帮帮我,如何减少下载时间?

1 个答案:

答案 0 :(得分:3)

从FTP服务器下载文件的多个连接可能只有在服务器限制每个连接的带宽时才有用,例如@fge在评论中表示。

我们来看看一些例子:

假设您有一个8 mbps的Internet连接,理论上最大下载速度为1兆字节/秒。

  

场景1 :您正在从强加下载限制的FTP服务器下载100兆字节的文件。

     

如果您使用一个连接下载文件,则下载它   在1兆字节/秒时,你需要100秒(1分40秒)。

     

通过使用两个连接(假设可以通过FTP同时下载一个文件的不同部分),您以0.5兆字节/秒的速度下载文件   对于每个连接,总计1兆字节/秒,也需要100   秒(1分40秒)下载文件。

     

因此我们得出结论,在这种情况下,多个连接不会   帮助


  

场景2 :您正在从FTP服务器下载100兆字节的文件,每个文件的下载限制为0.5兆字节/秒   连接。

     

如果您使用一个连接下载文件,则下载它   在0.5兆字节/秒(由服务器强加),你需要200   秒(3分20秒)。

     

通过使用两个连接(假设可以通过FTP同时下载一个文件的不同部分),您以0.5兆字节/秒的速度下载文件   对于每个连接,总计1兆字节/秒,花费100秒   (1分40秒)下载文件。

     

因此我们得出结论,在这种情况下,多个连接可以   实际上有所帮助。


  

场景3 :您正在下载多个文件 - 假设两个100 MB的文件 - 来自FTP服务器(下载限制)   被忽视,因为我们已经看到,当施加限制时,多次   连接可以帮助。)

     

如果您使用一个连接同时下载两个文件   每个文件(两个连接),您下载每个文件0.5   兆字节/秒,下载需要200秒(3分20秒)   两个文件。换句话说,你只能在200秒后获得这两个文件。

     

另一方面,逐个下载文件,只有一个   连接一次,你以1兆字节/秒的速度下载两个文件,什么   也需要200秒(3分20秒),你得到第一个文件   仅100秒(1分20秒)后,秒数为100秒   后面。

     

因此我们得出结论,在这种情况下,它取决于文件是否存在   它们本身或仅作为一个整体是有用的。

很抱歉无法直接解决您的问题,但我认为您应首先考虑这些情况,并了解在您的情况下是否有什么可以摆脱多个连接。