文档章节

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

DavidBao
 DavidBao
发布于 2014/12/16 22:32
字数 1019
阅读 45
收藏 0

由于上次说了,如果客户端遍历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个半小时。。。还是时间太长。。于是,多线程。。。。(命苦啊。。。。)

© 著作权归作者所有

DavidBao
粉丝 114
博文 213
码字总数 126729
作品 0
昌平
私信 提问
加载中

评论(0)

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

由于上次说了,如果客户端遍历FTP服务器的话,如果FTP上文件数量很大,那样的话,递归遍历的时间会超级长。。 (还没有说明。。我们这是EJB项目。。是FTP服务器上调用我的这个客户端进行下载...

猴子
2011/10/20
506
1
用commons-net包写Ftp客户端下载(一)

由于需要客户需求,需要把Ftp上的所有文件下载到本地,包括目录和文件。看到文件数量的时候我就哭了。。 几万个文件,晕死。这个地方我遇到的几个困难我会一一说明。 下载commons-net包我就不...

猴子
2011/10/20
4.4K
1
FTP断点续传卡死的问题。

用Apache Commons-Net包中的FtpClient做文件上传,从手机上传到服务器,手机使用WiFi连接,Server是Linux的vsftpd搭建的。 有以下特殊情况:上传文件到一半的时候,手动关掉WiFi致其上传失败...

摆渡者
2015/07/29
1.9K
0
使用apache的FTPServer搭建ftp服务器

一:启动ftp服务 1.下载Apache FtpServer 1.0.6 Release: http://mina.apache.org/downloads-ftpserver.html 2.解压后res/conf下找到user.properties (修改密码为admin默认是md5加密后的) ......

路叫兽
2016/08/11
463
0
用commons-net包写Ftp客户端下载(二)

上次写完了工具类,那么然后就是另一个工具类了。 1.也就是对ftp上文件的遍历。 这里我发现了一个问题,下载文件的时候,每次都得重新连接,也就是一次连接只能下载一个文件。 虽然到最后我也...

猴子
2011/10/20
892
0

没有更多内容

加载失败,请刷新页面

加载更多

Fedora 31 - 查杀木马

使用chkrootkit和rkhunter检查系统 #安装工具sudo dnf install chkrootkit rkhunter#修改配置##使用管理员邮箱地址sudo sed -i 's/^MAILTO=.*/MAILTO=admin@server.com/' /etc/sy......

wffger
11分钟前
21
0
检查目录是否存在,如果不存在则创建

我经常发现自己写的R脚本会产生大量输出。 我发现它更干净,可以将此输出放到自己的目录中。 我在下面编写的内容将检查目录是否存在并移入该目录,或者创建目录然后移入该目录。 有没有更好的...

javail
15分钟前
51
0
让你相见恨晚的Photoshop 使用技巧——用ps做后期渲染

无论是面对客户汇报方案还是在设计竞赛中脱颖而出,通过PS来渲染平面图都是至关重要的工作。无论何时,你的平面设计的出图质量便也是你的能力说明。 今天小编给大家带来真正的对建筑 / 规划/...

mac小叮当
18分钟前
63
0
推荐VSCode12个比较实用的插件

1、Auto Rename Tag ——自动重命名成对的HTML标记。假如你创建了一个<p>标记。现在你想更改它。有了这个软件,你只需要更改一个就行,另一个会自动修改。从理论上来说,使用这个软件可以把...

IT技术分享社区
22分钟前
45
0
LeetCode 347: 前 K 个高频元素Top K Frequent Elements

题目: 给定一个非空的整数数组,返回其中出现频率前 K 高的元素。 Given a non-empty array of integers, return the K most frequent elements. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2...

iCodeBugs
26分钟前
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部