java復制文件的4種方式
摘要
盡管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中四種不同的方法可以復制一個文件。