MergeFile-碎片文件的合并

package cn.itcast.io.split;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;

public class MergeFile {

	public static void main(String[] args) throws IOException {
		
		
		mergeFile_2(new File("e:\\filepart"));
	}
	/**
	 * 需求:完成对碎片文件的合并
	 * @param dir
	 * @throws IOException
	 */
	public static void mergeFile_2(File dir) throws IOException {
		
		/*
		 * 获取指定目录下的配置文件对象
		 * 
		 */
		File[] files=dir.listFiles(new SuffixFilter(".properties"));
		if(files.length!=1)
			throw new RuntimeException(dir+"该目录下没有.properties文件或者该文件不唯一");
		
		//记录配置的文件对象
		File confile=files[0];
		
		//获取该文件中的信息
		Properties pro=new Properties();
		FileInputStream fis=new FileInputStream(confile);
		pro.load(fis);
		
		String filename=pro.getProperty("filename");
		int count=Integer.parseInt(pro.getProperty("partcount"));
		
		//获取该目录下的所有碎片文件
		File[] partFiles=dir.listFiles(new SuffixFilter(".part"));
		if(partFiles.length!=(count-1))
			throw new RuntimeException("碎片文件个数不符合要求,应该是"+count+"个");
		
		//将碎片文件和流对象关联,并存储到集合中
		ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
		for(int x=0;x<partFiles.length;x++){
			al.add(new FileInputStream(partFiles[x]));
		}
		
		
		//将多个流合并成一个序列流
		Enumeration<FileInputStream> en=Collections.enumeration(al);
		SequenceInputStream sis=new SequenceInputStream(en);
		FileOutputStream fos=new FileOutputStream(new File(dir,filename));
		
		byte[] buf=new byte[1024];
		int len=0;
		while((len=sis.read(buf))!=-1){
			
			fos.write(buf, 0, len);
		}
		sis.close();
		fos.close();
		
		
		
	}
	public static void mergeFile_1(File dir) throws IOException{
		
		ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
		for(int x=1;x<=9;x++){
			al.add(new FileInputStream(new File(dir,x+".part")));
		}
		Enumeration<FileInputStream> en=Collections.enumeration(al);
		
		SequenceInputStream sis=new SequenceInputStream(en);
		FileOutputStream fos=new FileOutputStream("e:\\1.mp3");
		
		byte[] buf=new byte[1024];
		int len=0;
		
		while((len=sis.read(buf))!=-1){
			fos.write(buf, 0, len);
		}
		sis.close();
		fos.close();
	}

}




package cn.itcast.io.split;

import java.io.File;
import java.io.FilenameFilter;

public class SuffixFilter implements FilenameFilter {
	
	private String suffix;
	public SuffixFilter(String suffix) {
		super();
		this.suffix = suffix;
	}
	@Override
	public boolean accept(File dir, String name) {

		return name.endsWith(suffix);
	}

}


转载于:https://my.oschina.net/u/2422152/blog/483761

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值