1. 程式人生 > >《黑馬程式設計師》 合併流之檔案切割與合併的工具類

《黑馬程式設計師》 合併流之檔案切割與合併的工具類

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