4種java複製檔案的方式

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

儘管Java提供了一個可以處理檔案的IO操作類,但是沒有一個複製檔案的方法。複製檔案是一個重要的操作,當你的程式必須處理很多檔案相關的時候。然而有幾種方法可以進行Java檔案複製操作,下面列舉出4中最受歡迎的方式。

1. 使用FileStreams複製

這是最經典的方式將一個檔案的內容複製到另一個檔案中。 使用FileInputStream讀取檔案A的位元組,使用FileOutputStream寫入到檔案B。 這是第一個方法的程式碼:


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

正如你所看到的我們執行幾個讀和寫操作try的資料,所以這應該是一個低效率的,下一個方法我們將看到新的方式。

2. 使用FileChannel複製

Java NIO包括transferFrom方法,根據文件應該比檔案流複製的速度更快。這是第二種方法的程式碼:


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

3. 使用Commons IO複製

Apache Commons IO提供拷貝檔案方法在其FileUtils類,可用於複製一個檔案到另一個地方。它非常方便使用Apache Commons FileUtils類時,您已經使用您的專案。基本上,這個類使用Java NIO FileChannel內部。 這是第三種方法的程式碼:


private static void copyFileUsingApacheCommonsIO(File source, File dest)
throws IOException {
FileUtils.copyFile(source, dest);
}

4. 使用Java7的Files類複製

如果你有一些經驗在Java 7中你可能會知道,可以使用複製方法的Files類檔案,從一個檔案複製到另一個檔案。 這是第四個方法的程式碼:


private static void copyFileUsingJava7Files(File source, File dest)
throws IOException {  
Files.copy(source.toPath(), dest.toPath());
}

5. 測試

現在看到這些方法中的哪一個是更高效的,我們會複製一個大檔案使用每一個在一個簡單的程式。 從快取來避免任何效能明顯我們將使用四個不同的原始檔和四種不同的目標檔案。 讓我們看一下程式碼:


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

正如您可以看到的FileChannels拷貝大檔案是最好的方法。如果你處理更大的檔案,你會注意到一個更大的速度差。這是一個示例,該示例演示了Java中四種不同的方法可以複製一個檔案。

相關文章

程式語言 最新文章