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;
}



}
  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();
}
}


 

posted @ 2011-12-07 14:33  zento_AMr  阅读(1028)  评论(0编辑  收藏  举报