java中文件復制的4種方式


      今天一個同事問我文件復制的問題,他一個100M的文件復制的指定目錄下竟然成了1G多,嚇我一跳,后來看了他的代碼發現是自己通過字節流復制的,定義的字節數組很大,導致復制后目標文件非常大,其實就是空行等一些無效空間。我也是很少用這種方式拷貝問價,大多數用Apache提供的commons-io中的FileUtils,后來在網上查了下,發現還有其他的方式,效率更高,所以在此整理一下,也是自己的一個學習。

1. 使用FileStreams復制

比較經典的一個代碼,使用FileInputStream讀取文件A的字節,使用FileOutputStream寫入到文件B。

public static void copy(String source, String dest, int bufferSize) { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(new File(source)); out = new FileOutputStream(new File(dest)); byte[] buffer = new byte[bufferSize]; int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } catch (Exception e) { Log.w(TAG + ":copy", "error occur while copy", e); } finally { safelyClose(TAG + ":copy", in); safelyClose(TAG + ":copy", out); } }  
2.

2、使用FileChannel

Java NIO包括transferFrom方法,根據文檔應該比文件流復制的速度更快。

 

public static void copyNio(String source, String dest) { FileChannel input = null; FileChannel output = null; try { input = new FileInputStream(new File(from)).getChannel(); output = new FileOutputStream(new File(to)).getChannel(); output.transferFrom(input, 0, input.size()); } catch (Exception e) { Log.w(TAG + "copyNio", "error occur while copy", e); } finally { safelyClose(TAG + "copyNio", input); safelyClose(TAG + "copyNio", output); } }

3、 使用Apache Commons IO復制
Appache Commons IO 提供了一個FileUtils.copyFile(File from, File to)方法用於文件復制,如果項目里使用到了這個類庫,使用這個方法是個不錯的選擇。
它的內部也是使用Java NIO的FileChannel實現的。
commons-io的路徑:http://commons.apache.org/proper/commons-io/javadocs/api-release/index.html。里面還有很多實用的方法,如拷貝目錄、拷貝指定格式文件等。
private static void copyFileByApacheCommonsIO(File source, File dest) throws IOException { FileUtils.copyFile(source, dest); }
4、使用Java7的Files類復制
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
我沒有親測,找了下網友的測試程序和輸出,性能數據供大家參考(來源:https://www.jb51.net/article/70412.htm)
import java.io.File;
 
        
import java.io.FileInputStream;
 
        
import java.io.FileOutputStream;
 
        
import java.io.IOException;
 
        
import java.io.InputStream;
 
        
import java.io.OutputStream;
 
        
import java.nio.channels.FileChannel;
 
        
import java.nio.file.Files;
 
         
         
        
import org.apache.commons.io.FileUtils;
 
        
public class CopyFilesExample {
   public static void main(String[] args) throws InterruptedException,
 
        
       IOException {
 
        
     File source = new File( "C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt" );
 
        
     File dest = new File( "C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt" );
 
        
  
 
        
     // copy file using FileStreams
 
        
     long start = System.nanoTime();
 
        
     long end;
 
        
     copyFileUsingFileStreams(source, dest);
 
        
     System.out.println( "Time taken by FileStreams Copy = "
 
        
         + (System.nanoTime() - start));
 
     // copy files using java.nio.FileChannel
 
        
     source = new File( "C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt" );
 
        
     dest = new File( "C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt" );
 
        
     start = System.nanoTime();
 
        
     copyFileUsingFileChannels(source, dest);
 
        
     end = System.nanoTime();
 
        
     System.out.println( "Time taken by FileChannels Copy = " + (end - start));
     // copy file using Java 7 Files class
 
        
     source = new File( "C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt" );
 
        
     dest = new File( "C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt" );
 
        
     start = System.nanoTime();
 
        
     copyFileUsingJava7Files(source, dest);
 
        
     end = System.nanoTime();
 
        
     System.out.println( "Time taken by Java7 Files Copy = " + (end - start));
 
        
     // copy files using apache commons io
 
        
     source = new File( "C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt" );
 
        
     dest = new File( "C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt" );
 
        
     start = System.nanoTime();
 
        
     copyFileUsingApacheCommonsIO(source, dest);
 
        
     end = System.nanoTime();
 
        
     System.out.println( "Time taken by Apache Commons IO Copy = "
 
        
         + (end - start));
   }
 
        
   private static void copyFileUsingFileStreams(File source, File dest)
 
        
       throws IOException {
 
        
     InputStream input = null ;
 
        
     OutputStream output = null ;
 
        
     try {
 
        
       input = new FileInputStream(source);
 
        
       output = new FileOutputStream(dest);
 
        
       byte [] buf = new byte [ 1024 ];
 
        
       int bytesRead;
 
        
       while ((bytesRead = input.read(buf)) > 0 ) {
 
        
         output.write(buf, 0 , bytesRead);
 
        
       }
 
        
     } finally {
 
        
       input.close();
 
        
       output.close();
 
        
     }
 
        
   }
 
        
   private static void copyFileUsingFileChannels(File source, File dest)
 
        
       throws IOException {
 
        
     FileChannel inputChannel = null ;
 
        
     FileChannel outputChannel = null ;
 
        
     try {
 
        
       inputChannel = new FileInputStream(source).getChannel();
 
        
       outputChannel = new FileOutputStream(dest).getChannel();
 
        
       outputChannel.transferFrom(inputChannel, 0 , inputChannel.size());
 
        
     } finally {
 
        
       inputChannel.close();
 
        
       outputChannel.close();
 
        
     }
 
        
   }
 
        
   private static void copyFileUsingJava7Files(File source, File dest)
 
        
       throws IOException {
 
        
     Files.copy(source.toPath(), dest.toPath());
 
        
   }
 
        
   private static void copyFileUsingApacheCommonsIO(File source, File dest)
 
        
       throws IOException {
 
        
     FileUtils.copyFile(source, dest);
 
        
   }
}
 
        

輸出:

Time taken by FileStreams Copy = 127572360
 
        
Time taken by FileChannels Copy = 10449963
 
        
Time taken by Java7 Files Copy = 10808333
 
        
Time taken by Apache Commons IO Copy = 17971677
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM