Java 文件合并功能 (转)

mac2022-06-30  21

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; }} 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<File> tmpFileColl=FileOperateUtils.searchExtensionFile(directory, extensions, false); 59 //存储文件名称的字符串集合 60 Map<String,Integer> fileNameMap=new HashMap<String,Integer>(); 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<Entry<String,Integer>> fileNameEntryMap=fileNameMap.entrySet(); 73 for (Entry<String, Integer> entry : fileNameEntryMap) { 74 //文件的名称 75 final String fileName=entry.getKey(); 76 //获取同一个文件的所有的临时文件 77 Collection<File> 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;/** * 测试代码 * @author Owner **/public class FileCombineManagerMain {public static void main(String[] args) { FileCombineManager fileCombine=new FileCombineManager("E:/TestJoltProxy",new String[]{"tmp"}); fileCombine.combineFiles(); }}

 

转载于:https://www.cnblogs.com/zento/archive/2011/12/07/2279273.html

最新回复(0)