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

由于上次说了,如果客户端遍历FTP服务器的话,如果FTP上文件数量很大,那样的话,递归遍历的时间会超级长。。

(还没有说明。。我们这是EJB项目。。是FTP服务器上调用我的这个客户端进行下载。。我只想这个EJB客户端是发布在另一台

机器上的。。)

所以我就考虑,是否可以服务器端自己遍历,自己遍历FTP的文件夹,然后把遍历的结果通过webservice传给我。因为,本地遍历

的所需要的时间很少很少。比如13000个文件如果客户端遍历FTP服务器大概需要3个小时以上,然后本地遍历就1.4秒。。

很无语的效率。。所以服务器断遍历之后生成我需要的数据,然后传给我,我那道之后直接开始下载即可。。

FTP服务器端遍历工具类。。。(其实就是文件遍历。。)

 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多M

需要时间1个半小时。。。还是时间太长。。于是,多线程。。。。(命苦啊。。。。)

你可能感兴趣的:(遍历时间太长)