1. 程式人生 > >java 實現檔案複製的兩種方式

java 實現檔案複製的兩種方式

  檔案複製首先我們要考慮的是用字元流還是檔案流操作呢?
    若我們考慮的僅僅是文字之類的複製,字元流要好些。但是不可能總是文字檔案吧,有可能是聲音,影象,視訊等等,所以使用位元組流操作比較好。
    複製的兩種方式
      1.將原始檔中的內容全部讀取到記憶體中,並一次性寫入到目標檔案
      2.不將原始檔中的內容全部讀取到記憶體中來,而是採取邊讀邊寫的方式
下面就是採用這兩種方法對比
Java程式碼
  1. package zzs.file.demo;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. publicclass FileCopy {  
  10.     private File inputFile;  
  11.     private File outputFile;  
  12.     private InputStream inputStream;  
  13.     private OutputStream outputStream;  
  14.     public FileCopy(String inputPath,String outputPath) 
    throws FileNotFoundException{  
  15.         inputFile=new File(inputPath);  
  16.         outputFile=new File(outputPath);  
  17.         inputStream=new FileInputStream(inputFile);  
  18.         outputStream=new FileOutputStream(outputFile);  
  19.     }  
  20.     //一次性把資料全部讀取到記憶體中來,再一次性寫入
  21.     publicvoid copy1() throws IOException{  
  22.         byte b[]=newbyte[(int)inputFile.length()];  
  23.         inputStream.read(b);       //一次性讀入
  24.         outputStream.write(b);   //一次性寫入
  25. //      inputStream.close();
  26. //      outputStream.close();
  27.     }  
  28.     //邊讀邊寫
  29.     publicvoid copy2() throws IOException{  
  30.         int temp=0;  
  31.         while((temp=inputStream.read())!=-1){  
  32.             outputStream.write(temp);  
  33.         }  
  34.         inputStream.close();  
  35.         outputStream.close();  
  36.     }  
  37.     public File getInputFile() {  
  38.         return inputFile;  
  39.     }  
  40.     publicvoid setInputFile(File inputFile) {  
  41.         this.inputFile = inputFile;  
  42.     }  
  43.     public File getOutputFile() {  
  44.         return outputFile;  
  45.     }  
  46.     publicvoid setOutputFile(File outputFile) {  
  47.         this.outputFile = outputFile;  
  48.     }  
  49.     publicstaticvoid main(String[] args) throws IOException{  
  50.         String inputPath="e:"+File.separator+"Xfire.rar";  
  51.         String outputPath="f:"+File.separator+inputPath.substring(inputPath.indexOf(File.separator));  
  52.         FileCopy fileCopy=new FileCopy(inputPath, outputPath);  
  53.         long start1=System.currentTimeMillis();  
  54.         fileCopy.copy1();  
  55.         long end1=System.currentTimeMillis();  
  56.         System.out.println("一次性全部讀入記憶體複製檔案大小為"+fileCopy.getInputFile().length()+"位花費時間為:"+(end1-start1)+"ms");  
  57.         fileCopy.getOutputFile().delete();  
  58.         long start2=System.currentTimeMillis();  
  59.         fileCopy.copy2();  
  60.         long end2=System.currentTimeMillis();  
  61.         System.out.println("邊讀邊寫複製檔案大小為"+fileCopy.getInputFile().length()+"位花費時間為:"+(end2-start2)+"ms");  
  62.     }  
  63. }  

   經測試發現,對於讀取檔案的大小小於自身機器的記憶體時,採取方式1要比方式二快很多,但是若讀取的檔案大於自身記憶體則方式二好些。不過在這種情況下有更好的方式就是採取緩衝機制,讀取一塊,寫入一塊。結合了一和二的優點。