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