在项目中在一个文件目录中存放多个临时文件合并文件功能的,提供代码以供交流,如有不同意见一起商议,希望各位大牛提出更好的意见和建议.再次表示感谢.
- 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 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;
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();
- }
- }