`
longgangbai
  • 浏览: 7281513 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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
2
分享到:
评论
1 楼 wfm0105 2016-07-01  
少工具包import easyway.tbs.commons.FileOperateUtils;

相关推荐

    java文件分割器,文件合并

    文件分割和文件合并功能,java语言开发

    JAVA 哈工大JAVA实验 文件切割合并处理

    在这个实验中,学生将学习如何使用JAVA API有效地处理文件,实现文件的分割和合并功能。 文件切割是指将一个较大的文件分成若干个较小的部分,通常是为了便于传输、存储或者分块处理。在JAVA中,我们可以使用`java....

    java 多个小文件合成一个文件

    在Java编程语言中,将多个小文件合并成一个文件是一个常见的需求,特别是在处理大量数据或者进行文件归档时。这个过程通常称为文件拼接或文件合并。以下将详细讲解如何使用Java来实现这一功能。 首先,我们需要理解...

    java文件分割合并

    在这个场景下,Java的IO(Input/Output)库提供了丰富的功能来实现文件的读取、写入和流控制,从而实现文件的分割与合并。本文将详细介绍如何使用Java IO来完成这两个任务。 首先,我们来看一下文件分割的过程。...

    java实现文件合并与分割

    在Java编程语言中,文件合并与分割是常见的文件操作任务,尤其在大数据处理、日志分析和文件管理等场景中尤为关键。本程序提供了一个基础的实现,旨在帮助初学者理解这一过程,并通过MD5校验确保文件的完整性和未被...

    Java分布式文件对象存储Minio框架并发上传、下载、合并、删除等操作示例Demo完整版

    在Java开发中,Minio提供了丰富的API,使得开发者能够方便地进行文件的上传、下载、合并和删除等操作。本示例Demo将详细介绍如何在Java环境中利用Minio框架进行这些操作,并且这个示例是完整的,可以直接应用于生产...

    java pdf合并实例

    在Java开发中,PDF文档处理是一项常见的任务,特别是在企业级应用中,可能需要将多个PDF文件合并成一个,便于管理和阅读。本实例将探讨如何使用Java进行PDF合并,特别是通过iText库实现这一功能。 iText是一个开源...

    java多个pdf文件合并成一个

    通过以上步骤,你可以使用Java和Apache PDFBox成功地将多个Base64编码的PDF文件合并为一个PDF文件。这种方法在处理大量PDF文件时非常有效,且代码简洁易于维护。同时,Apache PDFBox库还提供了许多其他功能,如PDF元...

    java多个word文件合并.zip

    本文将详细介绍两种不同的方法来实现这一功能,结合给定的资源"java多个word文件合并.zip",我们将探讨如何使用JACOB库和Apache POI库来完成这个任务。 1. **JACOB库**: JACOB(Java COM Bridge)是一个开源的...

    多文件夹/文件的合并软件及源代码(Java)

    下面我们将深入探讨关于多文件夹/文件合并的知识点,以及如何使用Java实现这一功能。 **1. 文件与文件夹合并的概念** 文件合并通常涉及到将两个或多个文件内容拼接在一起,形成一个新的单一文件。而文件夹合并则...

    Java 文件合并

    在Java编程语言中,文件合并是一项常见的操作,特别是在处理大量数据或者日志文件时。本文将深入探讨如何使用`BufferedReader`和`FileReader`来实现这个功能。这两个类是Java标准库中的IO流类,它们能够高效地读取和...

    Hive内部表合并小文件Java程序

    这里我们将详细讨论如何通过Java程序实现Hive内部表的小文件合并。 首先,理解Hive内部表和外部表的区别是关键。内部表的数据由Hive完全管理,删除内部表会同时删除其对应的数据。而外部表仅仅是一个指向实际数据的...

    将大文件分割及合并java源码

    首先,我们来看一下`SplitImageUtil.java`这个文件,它是实现文件分割和合并功能的主要代码。在Java中,我们可以使用`java.io`包中的`File`类、`BufferedInputStream`和`BufferedOutputStream`进行文件操作。`...

    JAVA文件分割合并器

    【JAVA文件分割合并器】是一种基于Java编程语言开发的实用工具,主要功能是对大文件进行高效地分割和合并。在日常工作中,我们可能遇到需要处理大量数据或传输超大文件的情况,这时文件分割和合并的功能就显得尤为...

    java_文件拆分合并

    文件合并是将多个小文件合并回一个大文件的过程。这通常涉及读取每个子文件并将其内容追加到目标文件中。以下是一个简单的文件合并示例: ```java import java.io.*; public class FileMerger { public static ...

    java 多个pdf合并,目录生成(支持自定义目录),页码生成(源码)

    在Java开发中,有时我们需要处理多个PDF文档,例如将它们合并成一个文件或者为合并后的文件生成目录和页码。这个任务通常出现在报告生成、文档整合等场景中。本项目提供了一个纯Java实现的解决方案,它能有效地完成...

    java excel poi合并单元格

    总结,Java通过Apache POI库可以方便地处理Excel文件,包括合并单元格。这个过程涉及到创建工作簿和工作表,定义合并范围,写入数据并保存文件。在开发过程中,灵活运用这些方法可以满足各种复杂的Excel操作需求。

    多个xmind文件合并

    在IT行业中,Xmind是一款广泛使用的思维导图软件...为了进一步学习和实践,你可以解压这个文件,查看代码实现细节,或者运行程序来测试文件合并功能。记得在实际使用中遵循开源许可证和版权规定,尊重他人的劳动成果。

    POI合并多个相同的Excel或者合并Word文件

    总的来说,Java的POI库为我们提供了处理Microsoft Office文件的强大工具,无论是合并Excel还是Word文档,都能有效地完成任务。通过熟练掌握POI的使用,可以极大地提升工作效率,简化数据管理和文档处理的工作流程。

    Java PDF合并代码

    在"Java PDF合并代码"这个主题中,我们要实现的核心功能是将两个或多个PDF文件合并为一个。以下是一个简单的Java代码示例,演示了如何使用iText库来完成这个任务: ```java import com.itextpdf.text.Document; ...

Global site tag (gtag.js) - Google Analytics