使用ftpClient下载ftp上所有文件解析

 更新时间:2017年04月24日 08:48:25   作者:帅气的毛毛侠  
最近项目需要写个小功能,需求就是实时下载ftp指定文件夹下的所有文件(包括子目录)到本地文件夹中,保留文件到目录路径不变。今天小编给大家分享使用ftpClient下载ftp上所有文件的方法,需要的的朋友参考下吧

需求:最新项目需要,写个小功能,需求就是实时下载ftp指定文件夹下的所有文件(包括子目录)到本地文件夹中,保留文件到目录路径不变。

分析:关键在于实时和下载并保持原目录。实时使用线程的定时调度完成,主要做后者,这显然要使用递归,但是ftp上的文件是不能直接得到相对路径的(恕我才疏学浅,并没有在FTPClient类中找到类似getPath()的方法),因此路径是要自己记录。总体思路有以下:

  1、得到所有路径以及子路径:递归遍历所有文件到路径。参数:ftp为FTPClient对象,path为当前的路径,pathArray保存当前的路径,并将此路径集合带到主函数中去   

getPath(ftp,path,pathArray);
 public static void getPath(FTPClient ftp,String path,ArrayList<String> pathArray) throws IOException{
    FTPFile[] files = ftp.listFiles();
    for (FTPFile ftpFile : files) {
      if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue;
      if(ftpFile.isDirectory()){//如果是目录,则递归调用,查找里面所有文件
        path+="/"+ftpFile.getName();
        pathArray.add(path);
        ftp.changeWorkingDirectory(path);//改变当前路径
        getPath(ftp,path,pathArray);//递归调用
        path=path.substring(0, path.lastIndexOf("/"));//避免对之后的同目录下的路径构造作出干扰,
      }
    }
  }

  2、下载到指定的本地文件夹中,

    download(ftp, pathArray, "c:\\download");程序之前出了写错误,为了排查,我把下载分成两部分,第一部分先将所有目录创建完成,在第二个for循环中进行文件的下载。参数:ftp为FTPClient,pathArray为1中带出的路径集合,后面一个String为本地路径  

 public static void download(FTPClient ftp,ArrayList<String> pathArray,String localRootPath) throws IOException{
    for (String string : pathArray) {
      String localPath=localRootPath+string;
      File localFile = new File(localPath);
      if (!localFile.exists()) { 
        localFile.mkdirs(); 
      }
    }
    for (String string : pathArray) {
      String localPath=localRootPath+string;//构造本地路径
      ftp.changeWorkingDirectory(string);
      FTPFile[] file=ftp.listFiles();
      for (FTPFile ftpFile : file) {
        if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue;
        File localFile = new File(localPath);
        if(!ftpFile.isDirectory()){
          OutputStream is = new FileOutputStream(localFile+"/"+ftpFile.getName());
          ftp.retrieveFile(ftpFile.getName(), is);
          is.close();
        }
      }
    }
  }

测试的主函数,使用的ftpClient为org.apache.commons.net.ftp.FTPClient:

 public static void main(String[] args) throws SocketException, IOException {
    FTPClient ftp = new FTPClient();
    ftp.connect("127.0.0.1");
    ftp.login("test","test");
    int reply;
    reply = ftp.getReplyCode();
    if(!FTPReply.isPositiveCompletion(reply)) {
      ftp.disconnect();
      System.err.println("FTP server refused connection.");
      System.exit(1);
    }
    ftp.setBufferSize(1024);
    ftp.setFileType(FTP.BINARY_FILE_TYPE); 
    ftp.enterLocalPassiveMode();
    String path="";
    ArrayList<String> pathArray=new ArrayList<String>();
    getPath(ftp,path,pathArray);
    System.out.println(pathArray);
    download(ftp, pathArray, "c:\\download");
    ftp.logout();
    ftp.disconnect();
  }

以上所述是小编给大家介绍的使用ftpClient下载ftp上所有文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • elasticsearch集群cluster discovery可配式模块示例分析

    elasticsearch集群cluster discovery可配式模块示例分析

    这篇文章主要为大家介绍了elasticsearch集群cluster discovery可配式模块示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Javabean转换成json字符并首字母大写代码实例

    Javabean转换成json字符并首字母大写代码实例

    这篇文章主要介绍了javabean转成json字符并首字母大写代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java中的Collections类的使用示例详解

    Java中的Collections类的使用示例详解

    Collections类提供了一些静态方法,这些方法能够对List集合实现常用的算法操作,这些算法是排序,填充,移位和查找等。本文将通过示例为大家详细讲讲Collections类的使用,需要的可以参考一下
    2022-12-12
  • Java的枚举,注解和反射(二)

    Java的枚举,注解和反射(二)

    今天小编就为大家分享一篇关于Java枚举,注解与反射原理说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-07-07
  • Spring学习笔记之RedisTemplate的配置与使用教程

    Spring学习笔记之RedisTemplate的配置与使用教程

    这篇文章主要给大家介绍了关于Spring学习笔记之RedisTemplate配置与使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • Java源码跟踪阅读技巧【值得收藏】

    Java源码跟踪阅读技巧【值得收藏】

    今天跟大家分享一下我平时阅读源码的几个小技巧,对于阅读Java中间件如Spring、Dubbo等框架源码的同学有一定帮助。本文基于Eclipse IDE,感兴趣的朋友跟随小编一起看看吧
    2018-11-11
  • 一篇文章带你入门Java字面量和常量

    一篇文章带你入门Java字面量和常量

    这篇文章主要介绍了探究Java的常量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java中关于控制台读取数字或字符串的方法

    Java中关于控制台读取数字或字符串的方法

    下面小编就为大家带来一篇Java中关于控制台读取数字或字符串的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java 输入流中的read(byte[] b)方法详解

    Java 输入流中的read(byte[] b)方法详解

    这篇文章主要介绍了Java 输入流中的read(byte[] b)方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 使用java实现BBS论坛发送邮件过程详解

    使用java实现BBS论坛发送邮件过程详解

    这篇文章主要介绍了使用java发送邮件过程详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论