因为上次说了,若是客户端遍历FTP服务器的话,若是FTP上文件数量很大,那样的话,递归遍历的时间会超级长。。java
(尚未说明。。咱们这是EJB项目。。是FTP服务器上调用个人这个客户端进行下载。。我只想这个EJB客户端是发布在另外一台web
机器上的。。)apache
因此我就考虑,是否能够服务器端本身遍历,本身遍历FTP的文件夹,而后把遍历的结果经过webservice传给我。由于,本地遍历服务器
的所须要的时间不多不多。好比13000个文件若是客户端遍历FTP服务器大概须要3个小时以上,而后本地遍历就1.4秒。。多线程
很无语的效率。。因此服务器断遍历以后生成我须要的数据,而后传给我,我那道以后直接开始下载便可。。工具
FTP服务器端遍历工具类。。。(其实就是文件遍历。。)spa
import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.log4j.Logger; import ftpdownloadservice.FtpFile;//webservice /** * * 文件操做工具类 * * @author houly * */ public class FileUtil { // 日志 private static Logger logger = Logger.getLogger(FileUtil.class); public static List<FtpFile> traversalDir(File dir, List<FtpFile> list) { // logger.info("开始进入FileUtil中的traversalDir方法......"); // 判断参数 if (dir == null) { logger.error("参数为空....."); return null; } // 判断复制目录是不是目录 if (!dir.isDirectory()) { logger.error("开始目录设置错误...."); return null; } // 列出该目录下的全部文件 File[] files = dir.listFiles(); if (list == null) list = new ArrayList<FtpFile>(); for (int i = 0; i < files.length; i++) { File file = files[i]; // 递归调用...... if (file.isDirectory()) { traversalDir(file,list); } else { list.add(change(file,new File( ReadProperties.readProperties("rrs.properties", "ftpimagepath")))); } } // logger.info("开始进入FileUtil中的traversalDir方法结束......"); return list; } public static FtpFile change(File file,File dir){ if(file.isDirectory()){ logger.error("目标文件是目录"); return null; } if(dir==null || dir.isFile()){ logger.error("目录参数出错....."); return null; } String path = dir.getAbsolutePath(); String filePath = file.getAbsolutePath(); int index_begin = filePath.indexOf(path); if(index_begin == -1 ){ return null; } index_begin = path.length()-1; FtpFile ftpFile = new FtpFile(); ftpFile.setFileName(file.getName()); while(true){ int index_end = filePath.indexOf("\\", index_begin+1); if(index_end == index_begin+1 ){ ftpFile.getList().add("/"); } else if(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()); return ftpFile; }
很简单很少说了。。。线程
再发下客户端代码把。。。更改以后的。。。日志
public boolean executeDownload(List<FtpFile> list) { logger.info("进入FtpDownloadServiceImpl的executeDownload方法"); int num = list.size(); logger.info("遍历ftp目录里面文件的个数为" + num); String local_downLoad_dir = ConfigInfo.getFtpDownLoadDir(); logger.info("获得配置文件中下载目录为:" + local_downLoad_dir); int flag = 0; //根据遍历结果从FTP上下载文件 int count = 0; for (FtpFile file : list) { count++; logger.info("开始下载"+num+"个文件中的第"+count+"个文件"); //FTP链接 ftpHelper = new FtpHelper(); ftpHelper.connect(ConfigInfo.getFtpHostName(), ConfigInfo.getPort(), ConfigInfo.getUsername(), ConfigInfo .getPassword()); //该文件工做空间集合 List<String> filepath = file.getList(); //文件下载到本地的路径 String local_path = local_downLoad_dir; // 变动工做目录 // 组合下载路径 for (int i = 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 = new File(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) { return false; } return true; }
原本认为这样就会没事的。。可是发现单线程下载FTP速度太慢。。局域网里面,不限速的清空,13000多文件,400多Mcode
须要时间1个半小时。。。仍是时间太长。。因而,多线程。。。。(命苦啊。。。。)