盡管Java提供了一個可以處理文件的IO操作類,但是沒有一個復(fù)制文件的方法。復(fù)制文件是一個重要的操作,當(dāng)你的程序必須處理很多文件相關(guān)的時候。然而有幾種方法可以進(jìn)行Java文件復(fù)制操作,下面列舉出4中最受歡迎的方式。
1. 使用FileStreams復(fù)制
這是最經(jīng)典的方式將一個文件的內(nèi)容復(fù)制到另一個文件中。 使用FileInputStream讀取文件A的字節(jié),使用FileOutputStream寫入到文件B。 這是第一個方法的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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(); } } |
正如你所看到的我們執(zhí)行幾個讀和寫操作try的數(shù)據(jù),所以這應(yīng)該是一個低效率的,下一個方法我們將看到新的方式。
2. 使用FileChannel復(fù)制
Java NIO包括transferFrom方法,根據(jù)文檔應(yīng)該比文件流復(fù)制的速度更快。這是第二種方法的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
|
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復(fù)制
Apache Commons IO提供拷貝文件方法在其FileUtils類,可用于復(fù)制一個文件到另一個地方。它非常方便使用Apache Commons FileUtils類時,您已經(jīng)使用您的項(xiàng)目。基本上,這個類使用Java NIO FileChannel內(nèi)部。 這是第三種方法的代碼:
1
2
3
4
|
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { FileUtils.copyFile(source, dest); } |
4. 使用Java7的Files類復(fù)制
如果你有一些經(jīng)驗(yàn)在Java 7中你可能會知道,可以使用復(fù)制方法的Files類文件,從一個文件復(fù)制到另一個文件。 這是第四個方法的代碼:
1
2
3
4
|
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); } |
5. 測試
現(xiàn)在看到這些方法中的哪一個是更高效的,我們會復(fù)制一個大文件使用每一個在一個簡單的程序。 從緩存來避免任何性能明顯我們將使用四個不同的源文件和四種不同的目標(biāo)文件。 讓我們看一下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
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); } } |
輸出:
1
2
3
4
|
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中四種不同的方法可以復(fù)制一個文件。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。