Java提供了一個能夠處理文件的IO操做類。 可是沒有一個複製文件的方法。 複製文件是一個重要的操做,當你的程序必須處理不少文件相關的時候。 然而有幾種方法能夠進行Java文件複製操做,下面列舉出4中最受歡迎的方式。java
這是最經典的方式將一個文件的內容複製到另外一個文件中。 使用FileInputStream讀取文件A的字節,使用FileOutputStream寫入到文件B。 這是第一個方法的代碼:ios
private static void copyFileUsingFileStreams(File source, File dest)apache
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(); }
}緩存
正如你所看到的咱們執行幾個讀和寫操做try的數據,因此這應該是一個低效率的,下一個方法咱們將看到新的方式。性能
Java NIO包括transferFrom方法,根據文檔應該比文件流複製的速度更快。 這是第二種方法的代碼:測試
private static void copyFileUsingFileChannels(File source, File dest) throws IOException {code
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(); }
}文檔
Apache Commons IO提供拷貝文件方法在其FileUtils類,可用於複製一個文件到另外一個地方。它很是方便使用Apache Commons FileUtils類時,您已經使用您的項目。基本上,這個類使用Java NIO FileChannel內部。 這是第三種方法的代碼:get
private static void copyFileUsingApacheCommonsIO(File source, File dest)input
throws IOException { FileUtils.copyFile(source, dest);
}
若是你有一些經驗在Java 7中你可能會知道,能夠使用複製方法的Files類文件,從一個文件複製到另外一個文件。 這是第四個方法的代碼:
private static void copyFileUsingJava7Files(File source, File dest)
throws IOException { Files.copy(source.toPath(), dest.toPath());
}
如今看到這些方法中的哪個是更高效的,咱們會複製一個大文件使用每個在一個簡單的程序。 從緩存來避免任何性能明顯咱們將使用四個不一樣的源文件和四種不一樣的目標文件。 讓咱們看一下代碼:
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 FileStreamslong start = System.nanoTime(); long end; copyFileUsingFileStreams(source, dest); System.out.println("Time taken by FileStreams Copy = " + (System.nanoTime() - start)); // copy files using java.nio.FileChannelsource = 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 classsource = 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 iosource = 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
正如您能夠看到的FileChannels拷貝大文件是最好的方法。若是你處理更大的文件,你會注意到一個更大的速度差。 這是一個示例,該示例演示了Java中四種不一樣的方法能夠複製一個文件。