`
longgangbai
  • 浏览: 7259576 次
  • 性别: 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实验源码

    Java文本文件合并工具

    内容概要: 这段代码是一个Java小工具,名为 "TextFileMerger",用于将多个文本文件的内容合并成一个文件。 适用人群: 适用于需要整合多个文本文件内容的个人用户和小团队,特别是在日常工作中需要处理多个文本资源...

    CSVUtil.java

    网上好多的csv文件合并感觉都差点功能,因为想着把很多csv文件合并还得好解析,所以每解析一个csv文件必须加上文件名,无奈网上没找到,只能自己写了个,所以大家根据自己的需求去下载吧,希望能帮助到大家

    【面试笔试】写两个函数,完成文件分割与合并的功能

    分割的第1个文件含有文件合并的信息(以下简称 信息块),即通过解析第1个文件,即可完成文件合并的操作。具体说明如下: 信息块定义: 信息块数据长度:4字节,整数字串,不足前补0 信息块数据:原始文件名 文件...

    java 实现切割文件和合并文件的功能

    主要介绍了java 实现切割文件和合并文件的功能的相关资料,这里实现文件的切割的实现代码和文件合并的实现代码,需要的朋友可以参考下

    java文件操作工具类实现复制文件和文件合并

    主要介绍了java文件操作工具类,类实现了复制文件和文件合并的功能,需要的朋友可以参考下

    java分割合并文件

    本人实验时写的对文件进行分割与合并功能的一个小程序,其中仍包含很多问题,请多指教...

    java课程设计报告,javaEclipsePowerDesigner实现文件分割合并功能.pdf

    java课程设计报告,javaEclipsePowerDesigner实现文件分割合并功能.pdf

    java 文件切割和合并的程序

    文件的切割和上传的功能的主要功能。对于文件的合并,必须按照JTEXfile的页面上的编号从上到下排才能还原

    java实现合并2个文件中的内容到新文件中

    主要介绍了java实现合并2个文件中的内容到新文件中,思路非常不错,这里推荐给大家。

    JAVA 操作文件,读写。

    用java编写的一个操作文件的程序。具体功能是 将指定文件夹下面的所有txt文件的内容合并到一个txt里边。其中包含了java io流读写文件的操作。 将项目导入myeclipse直接运行就可以了。

    基于Hadoop的分布式文件系统,使用Java语言开发实现了一个本地文件管理系统+源代码+文档说明

    基于Hadoop的分布式文件系统,使用Java语言开发实现了一个本地文件管理系统,其中文件存在于HDFS集群中,通过Java开发的客户端软件进行管理,其功能包括:1、文件分块、加密并上传待HDFS文件系统 2、文件块下载、...

    Excel文件操作工具类,包括读、写、合并等功能

    自己修改的Excel文件操作工具类; 包括读、写、合并等功能; 自动识别Excel文件版本; 包含一个读Excel例程;

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    基于Java的的文件图片上传-分片上传-断点续传-秒传java源码.zip

    在文件上传部分已有功能的基础上实现了按10MB分为多个块,异步上传,服务端合并,MD5验证,文件秒传,断点续传,网络问题自动重试,手动重试; 4.图片上传部分:在文件上传部分已有功能的基础上实现了上传前缩略图...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    TXT文件合并器……

    此程序需要电脑上有JAVA运行环境才可以使用……是我学了大半个月...使用的都是一些非常初级的代码~~~~至于程序的功能,就跟名字一模一样啦。 用几个同学的电脑都测试过了,确定是能用的(只要安装了JAVA运行环境)~~~~

Global site tag (gtag.js) - Google Analytics