首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Java 资料合并功能

2012-08-01 
Java 文件合并功能????? 在项目中在一个文件目录中存放多个临时文件合并文件功能的,提供代码以供交流,如有

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

?

热点排行