1. 使用FileStreams复制
这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:
1private static void copyFileUsingFileStreams(File source, File dest) 2 throws IOException { 3 InputStream input = null; 4 OutputStream output = null; 5 try { 6 input = new FileInputStream(source); 7 output = new FileOutputStream(dest); 8 byte[] buf = new byte[1024]; 9 int bytesRead; 10 while ((bytesRead = input.read(buf)) > 0) { 11 output.write(buf, 0, bytesRead); 12 } 13 } finally { 14 input.close(); 15 output.close(); 16 } 17}
正如你所看到的我们执行几个读和写操作try的数据,所以这应该是一个低效率的,下一个方法我们将看到新的方式。
2. 使用FileChannel复制
Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。 这是第二种方法的代码:
1private static void copyFileUsingFileChannels(File source, File dest) throws IOException { 2 FileChannel inputChannel = null; 3 FileChannel outputChannel = null; 4 try { 5 inputChannel = new FileInputStream(source).getChannel(); 6 outputChannel = new FileOutputStream(dest).getChannel(); 7 outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); 8 } finally { 9 inputChannel.close(); 10 outputChannel.close(); 11 } 12}
3. 使用Commons IO复制
Apache Commons IO提供拷贝文件方法在其FileUtils类,可用于复制一个文件到另一个地方。它非常方便使用Apache Commons FileUtils类时,您已经使用您的项目。基本上,这个类使用Java NIO FileChannel内部。 这是第三种方法的代码:
1private static void copyFileUsingApacheCommonsIO(File source, File dest) 2 throws IOException { 3 FileUtils.copyFile(source, dest); 4}
4. 使用Java7的Files类复制
如果你有一些经验在Java 7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:
1private static void copyFileUsingJava7Files(File source, File dest) 2 throws IOException { 3 Files.copy(source.toPath(), dest.toPath()); 4}
5. 测试
现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。 从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。 让我们看一下代码:
1import java.io.File; 2import java.io.FileInputStream; 3import java.io.FileOutputStream; 4import java.io.IOException; 5import java.io.InputStream; 6import java.io.OutputStream; 7import java.nio.channels.FileChannel; 8import java.nio.file.Files; 9import org.apache.commons.io.FileUtils; 10 11public class CopyFilesExample { 12 13 public static void main(String[] args) throws InterruptedException, 14 IOException { 15 16 File source = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt"); 17 File dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt"); 18 19 // copy file using FileStreams 20 long start = System.nanoTime(); 21 long end; 22 copyFileUsingFileStreams(source, dest); 23 System.out.println("Time taken by FileStreams Copy = " 24 + (System.nanoTime() - start)); 25 26 // copy files using java.nio.FileChannel 27 source = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt"); 28 dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt"); 29 start = System.nanoTime(); 30 copyFileUsingFileChannels(source, dest); 31 end = System.nanoTime(); 32 System.out.println("Time taken by FileChannels Copy = " + (end - start)); 33 34 // copy file using Java 7 Files class 35 source = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt"); 36 dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt"); 37 start = System.nanoTime(); 38 copyFileUsingJava7Files(source, dest); 39 end = System.nanoTime(); 40 System.out.println("Time taken by Java7 Files Copy = " + (end - start)); 41 42 // copy files using apache commons io 43 source = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt"); 44 dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt"); 45 start = System.nanoTime(); 46 copyFileUsingApacheCommonsIO(source, dest); 47 end = System.nanoTime(); 48 System.out.println("Time taken by Apache Commons IO Copy = " 49 + (end - start)); 50 51 } 52 53 private static void copyFileUsingFileStreams(File source, File dest) 54 throws IOException { 55 InputStream input = null; 56 OutputStream output = null; 57 try { 58 input = new FileInputStream(source); 59 output = new FileOutputStream(dest); 60 byte[] buf = new byte[1024]; 61 int bytesRead; 62 while ((bytesRead = input.read(buf)) > 0) { 63 output.write(buf, 0, bytesRead); 64 } 65 } finally { 66 input.close(); 67 output.close(); 68 } 69 } 70 71 private static void copyFileUsingFileChannels(File source, File dest) 72 throws IOException { 73 FileChannel inputChannel = null; 74 FileChannel outputChannel = null; 75 try { 76 inputChannel = new FileInputStream(source).getChannel(); 77 outputChannel = new FileOutputStream(dest).getChannel(); 78 outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); 79 } finally { 80 inputChannel.close(); 81 outputChannel.close(); 82 } 83 } 84 85 private static void copyFileUsingJava7Files(File source, File dest) 86 throws IOException { 87 Files.copy(source.toPath(), dest.toPath()); 88 } 89 90 private static void copyFileUsingApacheCommonsIO(File source, File dest) 91 throws IOException { 92 FileUtils.copyFile(source, dest); 93 } 94 95}
1Time taken by FileStreams Copy = 127572360 2Time taken by FileChannels Copy = 10449963 3Time taken by Java7 Files Copy = 10808333 4Time taken by Apache Commons IO Copy = 17971677
正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。 这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。