java 文件合并功能

 在项目中在一个文件目录中存放多个临时文件合并文件功能的,提供代码以供交流,如有不同意见一起商议,希望各位大牛提出更好的意见和建议.再次表示感谢.
Java代码 复制代码  收藏代码
  1. package easyway.tbs.file.transport.core.combine;   
  2.   
  3. import java.io.BufferedOutputStream;   
  4. import java.io.File;   
  5. import java.io.FileOutputStream;   
  6. import java.io.IOException;   
  7. import java.util.ArrayList;   
  8. import java.util.Collection;   
  9. import java.util.List;   
  10.   
  11. import org.apache.commons.io.FileUtils;   
  12. import org.apache.commons.io.FilenameUtils;   
  13. import org.slf4j.Logger;   
  14. import org.slf4j.LoggerFactory;   
  15.   
  16.   
  17.   
  18. /**  
  19.  * 文件合并器  
  20.  *   1.首先将根据消息中线程数,过滤目录文件数目等于线程数表示文件下载完毕。  
  21.  *   2.开始合并临时文件为一个文件。  
  22.  *     
  23.  * @author longgangbai  
  24.  *  
  25.  */  
  26. public class FileCombineFetch extends Thread {   
  27.      private static final transient Logger LOG = LoggerFactory.getLogger(FileCombineFetch.class);   
  28.            
  29.     /**  
  30.      * 目标文件的名称  
  31.      */  
  32.     private File targetFile;   
  33.     /**  
  34.      * 临时文件的目录  
  35.      */  
  36.     private Collection tmpFiles;   
  37.     /**  
  38.      * 将需要合并的文件合并为一个文件  
  39.      *   
  40.      * @param targetFile     
  41.      *      需要生成的目标文件   
  42.      * @param tmpFiles       
  43.      *      临时文件的集合  
  44.      */  
  45.     public FileCombineFetch(String targetFile,Collection tmpFiles){   
  46.         this.targetFile=new File(targetFile);   
  47.         this.tmpFiles=tmpFiles;   
  48.     }   
  49.        
  50.     /**  
  51.      * 执行合并文件的线程方法  
  52.      *   
  53.      */  
  54.     public void run(){   
  55.         BufferedOutputStream outputStream=null;   
  56.         try {   
  57.             //创建读取文件流的目录   
  58.             outputStream = new BufferedOutputStream(new FileOutputStream(targetFile));   
  59.             List fileList=new ArrayList();   
  60.             fileList.addAll(fileList);   
  61. //          Collections.sort(fileList,new Comparator(){   
  62. //              public int compare(File file0, File file1) {   
  63. //                     
  64. //                  String fileIndex0=FilenameUtils.getBaseName(file0.getName()).split("_")[2];   
  65. //                  String fileIndex1=FilenameUtils.getBaseName(file1.getName()).split("_")[2];   
  66. //                  return  Integer.valueOf(fileIndex0).compareTo(Integer.valueOf(fileIndex1));   
  67. //              }   
  68. //          });   
  69.             for(int i=1;i<=tmpFiles.size();i++){   
  70.                 String tempFileName=targetFile.getParent()+File.separator+FilenameUtils.getBaseName(targetFile.getName())+"_"+tmpFiles.size()+"_"+i+".tmp";   
  71.                 File tempFile=new File(tempFileName);   
  72.                 System.out.println("tempFile="+tempFile.getAbsolutePath());   
  73.                 //读取文件的中信息   
  74.                 byte[] bytes=FileUtils.readFileToByteArray(tempFile);   
  75.                 //向目标文件中写入数据   
  76.                 outputStream.write(bytes);   
  77.                 //刷新缓冲区   
  78.                 outputStream.flush();   
  79.             }   
  80. /*          for (File tempFile : tmpFiles) {  
  81.                 System.out.println("tempFile"+tempFile.getName());  
  82.                 //读取文件的中信息  
  83.                 byte[] bytes=FileUtils.readFileToByteArray(tempFile);  
  84.                 //向目标文件中写入数据  
  85.                 outputStream.write(bytes);  
  86.                 //刷新缓冲区  
  87.                 outputStream.flush();  
  88.             }*/  
  89.             //刷新缓冲区   
  90.             outputStream.flush();   
  91.             //临时文件写完毕之后,删除临时文件   
  92.             for (File tempFile : tmpFiles) {   
  93.                 FileUtils.forceDelete(tempFile);   
  94.             }   
  95.                
  96.                
  97.             //向数据写日志   
  98.             //介绍文件成功   
  99.                
  100.         } catch (Exception e) {   
  101.             e.printStackTrace();   
  102.         }finally{   
  103.             try {   
  104.                 outputStream.close();   
  105.             } catch (IOException e) {   
  106.                 e.printStackTrace();   
  107.             }   
  108.         }    
  109.     }   
  110.   
  111.     public File getTargetFile() {   
  112.         return targetFile;   
  113.     }   
  114.   
  115.     public void setTargetFile(File targetFile) {   
  116.         this.targetFile = targetFile;   
  117.     }   
  118.   
  119.     public Collection getTmpFiles() {   
  120.         return tmpFiles;   
  121.     }   
  122.   
  123.     public void setTmpFiles(Collection tmpFiles) {   
  124.         this.tmpFiles = tmpFiles;   
  125.     }   
  126.        
  127.   
  128.   
  129. }  
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 tmpFiles;
	/**
	 * 将需要合并的文件合并为一个文件
	 * 
	 * @param targetFile   
	 * 		需要生成的目标文件 
	 * @param tmpFiles     
	 * 		临时文件的集合
	 */
	public FileCombineFetch(String targetFile,Collection tmpFiles){
		this.targetFile=new File(targetFile);
		this.tmpFiles=tmpFiles;
	}
	
    /**
     * 执行合并文件的线程方法
     * 
     */
	public void run(){
		BufferedOutputStream outputStream=null;
		try {
		    //创建读取文件流的目录
			outputStream = new BufferedOutputStream(new FileOutputStream(targetFile));
			List fileList=new ArrayList();
			fileList.addAll(fileList);
//			Collections.sort(fileList,new Comparator(){
//				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 getTmpFiles() {
		return tmpFiles;
	}

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


}



 

 

 

Java代码 复制代码  收藏代码
  1. package easyway.tbs.file.transport.core.combine;   
  2.   
  3. import static easyway.tbs.file.transport.commons.Constants.FILE_SEPARATOR_CHAR;   
  4.   
  5. import java.io.File;   
  6. import java.util.Collection;   
  7. import java.util.HashMap;   
  8. import java.util.Map;   
  9. import java.util.Set;   
  10. import java.util.Map.Entry;   
  11.   
  12. import org.apache.commons.collections.CollectionUtils;   
  13. import org.apache.commons.collections.Predicate;   
  14. import org.apache.commons.lang.StringUtils;   
  15. import org.slf4j.Logger;   
  16. import org.slf4j.LoggerFactory;   
  17.   
  18. import easyway.tbs.commons.FileOperateUtils;   
  19.   
  20. /**  
  21.  * 文件合并线程  
  22.  *   
  23.  * @author longgangbai  
  24.  *  
  25.  */  
  26. @SuppressWarnings("unchecked")   
  27. public class FileCombineManager {   
  28.      private static final transient Logger LOG = LoggerFactory.getLogger(FileCombineManager.class);   
  29.            
  30.        
  31.        
  32.     /**  
  33.      * 临时文件目录  
  34.      */  
  35.     private String tmpdir;   
  36.   
  37.     /**  
  38.      * 文件扩展后缀  
  39.      */  
  40.     private String[] extensions;   
  41.        
  42.   
  43.        
  44.        
  45.     public FileCombineManager(String tmpdir,String[] extensions){   
  46.         this.tmpdir=tmpdir;   
  47.         this.extensions=extensions;   
  48.     }   
  49.     /**  
  50.      *合并文件的信息   
  51.      */  
  52.     public void combineFiles(){   
  53.         //创建临时目录的文件系统   
  54.         File directory=new File(tmpdir);   
  55.            
  56.         if(directory.exists()){   
  57.             //获取所有的临时文件   
  58.             Collection tmpFileColl=FileOperateUtils.searchExtensionFile(directory, extensions, false);   
  59.             //存储文件名称的字符串集合   
  60.             Map fileNameMap=new HashMap();    
  61.             //遍历获取相关的临时文件信息   
  62.             for (File file : tmpFileColl) {   
  63.                 String fileName=file.getName();   
  64.                 //临时文件命名格式:目标文件名称+“_”+线程数+"_"+"当前下载的线程号"   
  65.                 String prefix=fileName.split(FILE_SEPARATOR_CHAR)[0];   
  66.                 Integer  threadNum=Integer.valueOf(fileName.split(FILE_SEPARATOR_CHAR)[1]);   
  67.                 if(!fileNameMap.containsKey(prefix)){   
  68.                     fileNameMap.put(prefix, threadNum);   
  69.                 }   
  70.             }   
  71.             //获取所有的临时文件名称   
  72.             Set> fileNameEntryMap=fileNameMap.entrySet();   
  73.             for (Entry entry : fileNameEntryMap) {   
  74.                     //文件的名称   
  75.                     final String fileName=entry.getKey();   
  76.                     //获取同一个文件的所有的临时文件   
  77.                     Collection oneFileTmpColl=CollectionUtils.predicatedCollection(tmpFileColl, new Predicate(){   
  78.                             public boolean evaluate(Object object) {   
  79.                                 File file=(File)object;   
  80.                                 StringUtils.contains(file.getName(), fileName);   
  81.                                 return true;   
  82.                             }   
  83.                     });   
  84.                     System.out.println("Coll ="+oneFileTmpColl);   
  85.                     //临时文件的总的数量   
  86.                     int totalTmpFile=oneFileTmpColl.size();   
  87.                     //检查临时文件是否现在完毕   
  88.                     if(totalTmpFile==entry.getValue()){   
  89.                         //开始执行合并工作   
  90.                         String targetFileName=tmpdir+File.separator+fileName+".txt";   
  91.                         new FileCombineFetch(targetFileName,oneFileTmpColl).start();   
  92.                     }   
  93.             }   
  94.         };   
  95.     }   
  96.        
  97.     public String[] getExtensions() {   
  98.         return extensions;   
  99.     }   
  100.     public void setExtensions(String[] extensions) {   
  101.         this.extensions = extensions;   
  102.     }   
  103.     public String getTmpdir() {   
  104.         return tmpdir;   
  105.     }   
  106.     public void setTmpdir(String tmpdir) {   
  107.         this.tmpdir = tmpdir;   
  108.     }   
  109.   
  110. }  
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 tmpFileColl=FileOperateUtils.searchExtensionFile(directory, extensions, false);
			//存储文件名称的字符串集合
			Map fileNameMap=new HashMap(); 
			//遍历获取相关的临时文件信息
			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> fileNameEntryMap=fileNameMap.entrySet();
			for (Entry entry : fileNameEntryMap) {
				    //文件的名称
				    final String fileName=entry.getKey();
				    //获取同一个文件的所有的临时文件
					Collection 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;
	}

}

 

 

 

Java代码   
  1. package easyway.tbs.file.transport.core.combine;   
  2.   
  3.   
  4.   
  5. /**  
  6.  * 测试代码  
  7.  * @author Owner  
  8.  *  
  9.  */  
  10. public class FileCombineManagerMain {   
  11.     public static void main(String[] args) {   
  12.         FileCombineManager  fileCombine=new FileCombineManager("E:/TestJoltProxy",new String[]{"tmp"});   
  13.         fileCombine.combineFiles();   
  14.     }   
  15. }  

你可能感兴趣的:(java)