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

因为上次说了,若是客户端遍历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个半小时。。。仍是时间太长。。因而,多线程。。。。(命苦啊。。。。)

相关文章
相关标签/搜索