Java 文件合并功能

      在项目中在一个文件目录中存放多个临时文件合并文件功能的,提供代码以供交流,如有不同意见一起商议,希望各位大牛提出更好的意见和建议.再次表示感谢.

package easyway.tbs.file.transport.core.combine;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;



/**
 * 文件合并器
 *   1.首先将根据消息中线程数,过滤目录文件数目等于线程数表示文件下载完毕。
 *   2.开始合并临时文件为一个文件。
 *   
 * @author longgangbai
 *
 */
public class FileCombineFetch extends Thread {
	 private static final transient Logger LOG = LoggerFactory.getLogger(FileCombineFetch.class);
		
	/**
	 * 目标文件的名称
	 */
	private File targetFile;
	/**
	 * 临时文件的目录
	 */
	private Collection<File> tmpFiles;
	/**
	 * 将需要合并的文件合并为一个文件
	 * 
	 * @param targetFile   
	 * 		需要生成的目标文件 
	 * @param tmpFiles     
	 * 		临时文件的集合
	 */
	public FileCombineFetch(String targetFile,Collection<File> tmpFiles){
		this.targetFile=new File(targetFile);
		this.tmpFiles=tmpFiles;
	}
	
    /**
     * 执行合并文件的线程方法
     * 
     */
	public void run(){
		BufferedOutputStream outputStream=null;
		try {
		    //创建读取文件流的目录
			outputStream = new BufferedOutputStream(new FileOutputStream(targetFile));
			List<File> fileList=new ArrayList<File>();
			fileList.addAll(fileList);
//			Collections.sort(fileList,new Comparator<File>(){
//				public int compare(File file0, File file1) {
//					
//					String fileIndex0=FilenameUtils.getBaseName(file0.getName()).split("_")[2];
//					String fileIndex1=FilenameUtils.getBaseName(file1.getName()).split("_")[2];
//					return  Integer.valueOf(fileIndex0).compareTo(Integer.valueOf(fileIndex1));
//				}
//			});
			for(int i=1;i<=tmpFiles.size();i++){
				String tempFileName=targetFile.getParent()+File.separator+FilenameUtils.getBaseName(targetFile.getName())+"_"+tmpFiles.size()+"_"+i+".tmp";
		    	File tempFile=new File(tempFileName);
		    	System.out.println("tempFile="+tempFile.getAbsolutePath());
		    	//读取文件的中信息
				byte[] bytes=FileUtils.readFileToByteArray(tempFile);
				//向目标文件中写入数据
				outputStream.write(bytes);
				//刷新缓冲区
				outputStream.flush();
			}
/*		    for (File tempFile : tmpFiles) {
		    	System.out.println("tempFile"+tempFile.getName());
		    	//读取文件的中信息
				byte[] bytes=FileUtils.readFileToByteArray(tempFile);
				//向目标文件中写入数据
				outputStream.write(bytes);
				//刷新缓冲区
				outputStream.flush();
			}*/
		    //刷新缓冲区
			outputStream.flush();
			//临时文件写完毕之后,删除临时文件
			for (File tempFile : tmpFiles) {
				FileUtils.forceDelete(tempFile);
			}
			
			
			//向数据写日志
			//介绍文件成功
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				outputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} 
	}

	public File getTargetFile() {
		return targetFile;
	}

	public void setTargetFile(File targetFile) {
		this.targetFile = targetFile;
	}

	public Collection<File> getTmpFiles() {
		return tmpFiles;
	}

	public void setTmpFiles(Collection<File> tmpFiles) {
		this.tmpFiles = tmpFiles;
	}
	


}



 

 

 

package easyway.tbs.file.transport.core.combine;

import static easyway.tbs.file.transport.commons.Constants.FILE_SEPARATOR_CHAR;

import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import easyway.tbs.commons.FileOperateUtils;

/**
 * 文件合并线程
 * 
 * @author longgangbai
 *
 */
@SuppressWarnings("unchecked")
public class FileCombineManager {
	 private static final transient Logger LOG = LoggerFactory.getLogger(FileCombineManager.class);
		
	
	
	/**
	 * 临时文件目录
	 */
	private String tmpdir;

	/**
	 * 文件扩展后缀
	 */
	private String[] extensions;
	

	
	
	public FileCombineManager(String tmpdir,String[] extensions){
		this.tmpdir=tmpdir;
		this.extensions=extensions;
	}
	/**
	 *合并文件的信息 
	 */
	public void combineFiles(){
		//创建临时目录的文件系统
		File directory=new File(tmpdir);
		
		if(directory.exists()){
			//获取所有的临时文件
			Collection<File> tmpFileColl=FileOperateUtils.searchExtensionFile(directory, extensions, false);
			//存储文件名称的字符串集合
			Map<String,Integer> fileNameMap=new HashMap<String,Integer>(); 
			//遍历获取相关的临时文件信息
			for (File file : tmpFileColl) {
				String fileName=file.getName();
				//临时文件命名格式:目标文件名称+“_”+线程数+"_"+"当前下载的线程号"
				String prefix=fileName.split(FILE_SEPARATOR_CHAR)[0];
				Integer  threadNum=Integer.valueOf(fileName.split(FILE_SEPARATOR_CHAR)[1]);
				if(!fileNameMap.containsKey(prefix)){
					fileNameMap.put(prefix, threadNum);
				}
			}
			//获取所有的临时文件名称
			Set<Entry<String,Integer>> fileNameEntryMap=fileNameMap.entrySet();
			for (Entry<String, Integer> entry : fileNameEntryMap) {
				    //文件的名称
				    final String fileName=entry.getKey();
				    //获取同一个文件的所有的临时文件
					Collection<File> oneFileTmpColl=CollectionUtils.predicatedCollection(tmpFileColl, new Predicate(){
							public boolean evaluate(Object object) {
								File file=(File)object;
								StringUtils.contains(file.getName(), fileName);
								return true;
							}
					});
					System.out.println("Coll ="+oneFileTmpColl);
					//临时文件的总的数量
					int totalTmpFile=oneFileTmpColl.size();
					//检查临时文件是否现在完毕
					if(totalTmpFile==entry.getValue()){
						//开始执行合并工作
						String targetFileName=tmpdir+File.separator+fileName+".txt";
						new FileCombineFetch(targetFileName,oneFileTmpColl).start();
					}
			}
		};
	}
	
	public String[] getExtensions() {
		return extensions;
	}
	public void setExtensions(String[] extensions) {
		this.extensions = extensions;
	}
	public String getTmpdir() {
		return tmpdir;
	}
	public void setTmpdir(String tmpdir) {
		this.tmpdir = tmpdir;
	}

}

 

 

 

package easyway.tbs.file.transport.core.combine;



/**
 * 测试代码
 * @author Owner
 *
 */
public class FileCombineManagerMain {
	public static void main(String[] args) {
		FileCombineManager  fileCombine=new FileCombineManager("E:/TestJoltProxy",new String[]{"tmp"});
		fileCombine.combineFiles();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值