用commons-net包写Ftp客户端下载(三)

由于上次说了,如果客户端遍历FTP服务器的话,如果FTP上文件数量很大,那样的话,递归遍历的时间会超级长。。

(还没有说明。。我们这是EJB项目。。是FTP服务器上调用我的这个客户端进行下载。。我只想这个EJB客户端是发布在另一台

机器上的。。)

所以我就考虑,是否可以服务器端自己遍历,自己遍历FTP的文件夹,然后把遍历的结果通过webservice传给我。因为,本地遍历

的所需要的时间很少很少。比如13000个文件如果客户端遍历FTP服务器大概需要3个小时以上,然后本地遍历就1.4秒。。

很无语的效率。。所以服务器断遍历之后生成我需要的数据,然后传给我,我那道之后直接开始下载即可。。

FTP服务器端遍历工具类。。。(其实就是文件遍历。。)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
importjava.io.File;
importjava.util.ArrayList;
 
importjava.util.Date;
importjava.util.List;
 
importorg.apache.log4j.Logger;
 
import ftpdownloadservice.FtpFile;//webservice
 
 
 
 
 
/**
 *
 * 文件操作工具类
 *
 * @author houly
 *
 */
publicclassFileUtil {
    // 日志
    privatestaticLogger logger = Logger.getLogger(FileUtil.class);
 
     
    publicstaticList<FtpFile> traversalDir(File dir, List<FtpFile> list) {
    //  logger.info("开始进入FileUtil中的traversalDir方法......");
        // 判断参数
        if(dir ==null) {
            logger.error("参数为空.....");
            returnnull;
        }
        // 判断复制目录是否是目录
        if(!dir.isDirectory()) {
            logger.error("开始目录设置错误....");
            returnnull;
        }
        // 列出该目录下的所有文件
        File[] files = dir.listFiles();
        if(list ==null)
            list =newArrayList<FtpFile>();
        for(inti =0; i < files.length; i++) {
            File file = files[i];
            // 递归调用......
            if(file.isDirectory()) {
                traversalDir(file,list);
            }else{
                list.add(change(file,newFile( ReadProperties.readProperties("rrs.properties","ftpimagepath"))));
            }
        }
         
         
         
    //  logger.info("开始进入FileUtil中的traversalDir方法结束......");
        returnlist;
    }
 
    publicstaticFtpFile change(File file,File dir){
 
        if(file.isDirectory()){
            logger.error("目标文件是目录");
            returnnull;
        }
         
        if(dir==null||  dir.isFile()){
            logger.error("目录参数出错.....");
            returnnull;
        }
         
        String path = dir.getAbsolutePath();
         
        String filePath = file.getAbsolutePath();
         
        intindex_begin = filePath.indexOf(path);
         
        if(index_begin == -1){
            returnnull;
        }
        index_begin = path.length()-1;
        FtpFile ftpFile =newFtpFile();
        ftpFile.setFileName(file.getName());
        while(true){
             
            intindex_end = filePath.indexOf("\\", index_begin+1);
            if(index_end == index_begin+1){
                ftpFile.getList().add("/");
            }
            elseif(index_end == -1){
                break;
            }
            else{
                ftpFile.getList().add(filePath.substring(index_begin+1, index_end));
            }
            index_begin = index_end;
             
        }
//      logger.info("内容");
//      logger.info(ftpFile.getList());
        returnftpFile;
    }

很简单不多说了。。。

再发下客户端代码把。。。更改之后的。。。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
publicbooleanexecuteDownload(List<FtpFile> list) {
    logger.info("进入FtpDownloadServiceImpl的executeDownload方法");
 
    intnum = list.size();
    logger.info("遍历ftp目录里面文件的个数为"+ num);
 
    String local_downLoad_dir = ConfigInfo.getFtpDownLoadDir();
    logger.info("得到配置文件中下载目录为:"+ local_downLoad_dir);
 
    intflag =0;
    //根据遍历结果从FTP上下载文件
    intcount =0;
    for(FtpFile file : list) {
        count++;
        logger.info("开始下载"+num+"个文件中的第"+count+"个文件");
        //FTP连接
        ftpHelper =newFtpHelper();
        ftpHelper.connect(ConfigInfo.getFtpHostName(),
                ConfigInfo.getPort(), ConfigInfo.getUsername(), ConfigInfo
                        .getPassword());
         
        //该文件工作空间集合
        List<String> filepath = file.getList();
        //文件下载到本地的路径
        String local_path = local_downLoad_dir;
         
        // 变更工作目录
        // 组合下载路径
        for(inti =0; i < filepath.size(); i++) {
            //如果是空间默认的开始工作空间
            if("/".equals(filepath.get(i))) {
                local_path += filepath.get(i);
            }else{
                //其他的工作空间
                 
                //变更工作空间
                ftpHelper.changeDir(filepath.get(i));
                 
                //组合本地路径
                local_path += filepath.get(i) +"/";
            }
        }
 
        logger.info("组合之后下载目录为:"+ local_path);
         
        //如果本地工作路径不存在,建立目录
        File local_file =newFile(local_path);
        if(!local_file.exists()) {
            local_file.mkdirs();
        }
         
        //进行下载并返回下载结果
        Boolean status = ftpHelper.downloadonefile(file
                .getFileName(), local_path + file.getFileName());
 
        if(!status)
            flag++;
 
        //断开FTP连接
        ftpHelper.disconnect();
 
    }
 
     
    //判断返回结果
    logger.info("进入FtpDownloadServiceImpl的executeDownload方法结束");
    if(flag !=0) {
        returnfalse;
    }
 
    returntrue;
}

 

本来认为这样就会没事的。。但是发现单线程下载FTP速度太慢。。局域网里面,不限速的清空,13000多文件,400多M

需要时间1个半小时。。。还是时间太长。。于是,多线程。。。。(命苦啊。。。。)

你可能感兴趣的:(Ftp客户端下载)