0 0

Java用FTPClient类用线程池下载多个文件到本地?15

使用org.apache.commons.net.ftp.FTPClient 类,说说我的实现思想,我要创建一个线程池,如果有10个线程,要去FTP的一个目录下载文件到本地,假如这个目录有50个文件,假如这10个线程去下载50个文件,线程A下载一个文件时,其余的线程绕过这个文件去下载另外的文件,当线程A下载完毕后,继续下载其他没有下载的文件,请问这样如何实现,保证线程安全(避免几个线程同时下载一个文件的情况)?最好能贴代码,多谢!提升下载的速度!

问题补充:
avgguy 写道
用一个List保存要下载的文件列表,另一个List保存已下载的文件列表。每个线程下载开始前都去前面那个List获取要下载的文件,下载完成后将文件保存到已下载的List中。

你可以参考下面的简化线程类


//下载线程类
public class DownloadThread extend Thread{
   List<String>  fileList;
   FtpClient ftp;

   public DownloadThread(List<String>  fileList, FtpClient ftp){
       this.fileList = fileList;
       this.ftp = ftp;
   }

   public void start(){      
       String dstFn = "d:\\file"; 
         while(!fileList.isEmpty()){
           String fn = null;
           synchronized(fileList){
             fn = fileList.get(0);
             fileList.remove(0);
           }
           download(fn, dstFn, ftp);
         }
    }
           
   //下载文件
   private void download(String filename, String dstFilename, FtpClient ftp){
      //下载代码,还应该处理异常等
      FileOutputStream fos = new FIle(dstFilename);
      ftp.downloadFile(filename, fos);
      fos.close();
   }
       
     
}



有点慢!
2011年12月21日 21:02

2个答案 按时间排序 按投票排序

0 0

引用

avgguy 写道
用一个List保存要下载的文件列表,另一个List保存已下载的文件列表。每个线程下载开始前都去前面那个List获取要下载的文件,下载完成后将文件保存到已下载的List中。

你可以参考下面的简化线程类

Java代码  收藏代码

    //下载线程类 
    public class DownloadThread extend Thread{ 
       List<String>  fileList; 
       FtpClient ftp; 
     
       public DownloadThread(List<String>  fileList, FtpClient ftp){ 
           this.fileList = fileList; 
           this.ftp = ftp; 
       } 
     
       public void start(){       
           String dstFn = "d:\\file";  
             while(!fileList.isEmpty()){ 
               String fn = null; 
               synchronized(fileList){ 
                 fn = fileList.get(0); 
                 fileList.remove(0); 
               } 
               download(fn, dstFn, ftp); 
             } 
        } 
                
       //下载文件 
       private void download(String filename, String dstFilename, FtpClient ftp){ 
          //下载代码,还应该处理异常等 
          FileOutputStream fos = new FIle(dstFilename); 
          ftp.downloadFile(filename, fos); 
          fos.close(); 
       } 
            
          
    } 



有点慢!


你也可以尝试在 download 方法内创建 FtpClient。不过,那样应该也不能提高速度。如果FTP服务器限制了只能单线程下载的话,就只能每次下载一个文件了。

2011年12月26日 09:36
0 0

用一个List保存要下载的文件列表,另一个List保存已下载的文件列表。每个线程下载开始前都去前面那个List获取要下载的文件,下载完成后将文件保存到已下载的List中。

你可以参考下面的简化线程类


//下载线程类
public class DownloadThread extend Thread{
   List<String>  fileList;
   FtpClient ftp;

   public DownloadThread(List<String>  fileList, FtpClient ftp){
       this.fileList = fileList;
       this.ftp = ftp;
   }

   public void start(){      
       String dstFn = "d:\\file"; 
         while(!fileList.isEmpty()){
           String fn = null;
           synchronized(fileList){
             fn = fileList.get(0);
             fileList.remove(0);
           }
           download(fn, dstFn, ftp);
         }
    }
           
   //下载文件
   private void download(String filename, String dstFilename, FtpClient ftp){
      //下载代码,还应该处理异常等
      FileOutputStream fos = new FIle(dstFilename);
      ftp.downloadFile(filename, fos);
      fos.close();
   }
       
     
}


2011年12月22日 15:29

相关推荐

    Spring Boot整合FTPClient线程池的实现示例

    FTPClient 是一个基于 Java 的 FTP 客户端库,提供了丰富的 FTP 操作 API,例如上传、下载、删除文件等。然而,在高并发场景下,频繁创建和销毁 FTPClient 对象可能会对服务器造成很大的压力。 为了解决这个问题,...

    完整实现ftp上传与下载并解析csv文件

    创建一个线程池来处理每个文件的下载任务,每个任务通过FTP客户端下载一个文件。`Future`接口可以用来查询任务状态,获取结果或取消任务。并发处理可以显著提高下载效率,但需要合理控制线程数量以避免资源耗尽。 4...

    java上传、下载、删除ftp文件-源码

    此外,为了提高性能和可靠性,可以考虑使用线程池来并行处理多个文件任务。记住,始终确保对网络资源进行适当的管理和关闭,以防止资源泄露。在开发过程中,你可以利用`ftpDemo`这样的测试文件进行调试和验证代码的...

    FTP文件管理管理模块 java实现

    FTP文件管理管理模块在Java中的实现涉及到多个关键知识点,涵盖了网络通信、文件处理以及多线程编程。以下是对这些知识点的详细阐述: 1. FTP(File Transfer Protocol)协议:FTP是一种用于在网络上进行文件传输的...

    基于java开发的多线程下载工具(源码)

    Java提供了强大的多线程编程能力,通过`java.lang.Thread`类或`java.util.concurrent`包中的`ExecutorService`和`Future`接口,可以方便地创建和管理多个下载线程。每个线程负责下载文件的一部分,这样可以充分利用...

    java ftp 上传 IIS 展示,代码+文档

    此外,为了提高性能,可以考虑使用线程池并发上传多个文件,或者使用连接池管理FTP连接。 总的来说,Java FTP上传IIS的实现涉及到Java网络编程、FTP协议、可能的第三方库使用,以及良好的异常管理和资源管理实践。...

    Http下载器 FTP下载器(java)

    8. **多线程与并发**:为了提高下载速度,可以考虑使用多线程并发下载,将大文件分成多个部分同时下载。Java的`ExecutorService`和`Future`接口可以帮助管理和协调这些并发任务。 9. **状态持久化**:为了在程序...

    java工具类

    例如,我们可以创建一个方法,将多个文件或目录打包成ZIP文件,或者使用`ZipFile`类来遍历ZIP文件内容并提取所需文件。这个工具类在文件归档、数据备份或者网络传输时非常实用。 2. **Java线程封装**: 在多线程...

    java FTP多线程 批量 断点续传

    Java FTP多线程批量断点续传是一种在Java编程中实现高效、稳定文件传输的方法,尤其适用于大文件的上传和下载。在这个过程中,我们利用FTP(File Transfer Protocol)协议,结合多线程技术和断点续传功能,可以显著...

    java通过FtpCilent实现FTP

    此外,为了提高性能和可靠性,可以考虑使用线程池来并发执行多个FTP任务。 总的来说,Java通过`FtpClient`实现FTP功能,为开发者提供了一种高效、灵活的文件传输解决方案,适用于各种需要与FTP服务器交互的应用场景...

    java编写ftp定时上传下载

    综上所述,"java编写ftp定时上传下载" 这一主题涵盖了Java编程、网络文件传输、定时任务调度、配置文件读取等多个方面,通过合理地组合这些技术,可以实现自动化的FTP文件管理和同步,大大提高了工作效率。...

    java 多线程ftp代码

    在多线程环境下,每个线程可以处理一个或多个文件的上传或下载。 6. 异常处理:由于网络环境的不可靠性,FTP操作可能会抛出异常。因此,需要对这些异常进行适当的捕获和处理,如SocketTimeoutException、...

    java实现FTP多线程断点续传

    Java中的`RandomAccessFile`类提供了一种方式,可以定位到文件中的任意位置,这对于实现断点续传非常有用。 4. **多线程传输**:为了提高传输效率,可以使用多个线程同时传输文件的不同部分。这需要将文件分割成多...

    JAVA文件传输(LW+源代码).rar

    综上所述,这个"JAVA文件传输(LW+源代码).rar"包为学习和实践Java文件传输提供了丰富的资源,涵盖了从基础的I/O流到高级的网络通信和并发处理等多个方面。通过深入研究源代码和论文,开发者不仅可以掌握文件传输的...

    多线程下载支持断点续传

    首先,多线程下载是一种利用网络资源的方式,它将一个大文件分成多个部分,通过创建多个并行的网络连接,同时下载这些部分,从而加快下载速度。这种方式可以充分利用网络带宽,尤其在下载大文件时,可以显著减少下载...

    JAVA文件传输(论文+源代码).rar

    除了Socket编程,Java还可以通过FTPClient和HttpClient等库实现FTP和HTTP协议的文件上传和下载,这些协议是互联网上广泛使用的文件传输协议。 九、源代码分析 源代码部分可能包含了一个完整的Java文件传输系统实现...

    JAVA经典软件代码

    在“JAVA经典软件代码”这个资源包中,包含了多个基于Java编程语言的示例应用,这些应用涵盖了网络通信、文件传输、多媒体处理等多个领域。以下是这些应用的主要知识点和功能介绍: 1. **二人聊天室(chap03)** -...

    java实现ftp

    - 可以使用线程池来处理多个并发连接,每个连接由一个单独的线程处理。 - 自定义FTP服务器需要实现文件操作逻辑,如读取、写入、删除文件,以及目录管理。 2. **Apache Commons Net库** - Apache Commons Net库...

    ftp多线程下载和上传

    为了实现多线程,我们需要创建多个线程或线程池,每个线程负责处理文件的一部分。 以下是一个简化的Python示例,展示了如何使用`ftplib`库实现多线程FTP下载: ```python import threading import ftplib def ...

    Java-FTPServer.rar_FTPServer JAVA_FTP服务器_java FtpServer_java 监听f

    8. **并发处理**:高质量的FTP服务器应能处理多个并发连接,Java FTPServer可能会使用线程池来管理并发连接,保证服务器的稳定性和性能。 9. **配置与扩展**:Java FTPServer的配置文件一般包含服务器的各项参数,...

Global site tag (gtag.js) - Google Analytics