《黑馬程式設計師》 合併流之檔案切割與合併的工具類
阿新 • • 發佈:2019-02-19
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(); } }