《黑马程序员》 合并流之文件切割与合并的工具类

class FileUtils 
{
	/*
	   文件的切割与合并的工具类
	*/
	public static void main(String[] args) 
	{
		File file=new File("c:\\test.avi");
		File srcDir;
		File dFile;
		try{
//			split(file);
			srcDir=new File("c:\\temp");
			dFile=new File("c:\\temp\\temp.avi");
			merge(srcDir,dFile);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	//将分割的文件进行合并
	//需要传递指定的目录,和合并后的文件的对象
	public static void merge(File dir,File dFile) throws IOException{
		//Vector它虽然是可以获取enumeration但是速度太慢
		//使用arraylist效率会高一些
		ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
		for(int x=1;x<=getPartCount(dir);x++){
			//创建与之对应的流对象
			al.add(new FileInputStream("c:\\temp\\temp"+x+".part"));
		}
		//arraylist中没有enumeration.它有iterator
		//我们可以自己来实现
		final Iterator<FileInputStream> it=al.iterator();
		//我们自己来实现
		Enumeration<FileInputStream> en=new Enumeration<FileInputStream>(){
			//我们创建这个类的实现对象我们就要覆盖里面的方法
			public boolean hasMoreElements(){
				return it.hasNext();
			}

			public FileInputStream nextElement(){
				return it.next();
			}
		};
		//创建合并流
		SequenceInputStream sis=new SequenceInputStream(en);
		//我们来读取数据并且进行操作
		byte[] buff=new byte[1024];
		int len=0;
		FileOutputStream fos=new FileOutputStream(dFile);
		while((len=sis.read(buff))!=-1){
			fos.write(buff,0,len);
		}
		fos.close();
		sis.close();
	}

	//获取指定目录下的part切割文件的数量
	public static int getPartCount(File dir) throws IOException{
		ArrayList<File> list=new ArrayList<File>();
		if(dir.isDirectory()){
			//如果是目录则执行该动作
			File[] files=dir.listFiles();
			for(File file:files){
				if(file.isDirectory()){
					getPartCount(file);
				}else{
					//获取part文件的数量
					if(file.getName().endsWith(".part")){
						list.add(file);
					}
				}
			}
		}
	    return list.size();  //否则直接返回0
	}
    
	//文件切割的方法
	public static void split(File sFile) throws IOException{
		//使用流和文件相关联
		FileInputStream fis=new FileInputStream(sFile);
		//文件输出流
		FileOutputStream fos=null;
		//新建一个大小为1MB的缓存
		byte[] buffer=new byte[1024*1024];
		int len=0; //记录读取的文件的个数
		int count=1;  //用于文件名的计数
		while((len=fis.read(buffer))!=-1){
			fos=new FileOutputStream(new File("c:\\temp"+(count++)+".part"));
			fos.write(buffer,0,len);  //把数据写入到文件中
			fos.close();  //关闭流
		}
		fis.close();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值