Java复制文件的4种方式

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中四种不同的方法可以复制一个文件。

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Python基础8——文件操作

16文件操作16.1文件操作的基本概念文件操作的步骤1.打开文件2.读、写文件3.关闭文件open函数,创建一个file对象,默认是以只读的方式打开read方法:一次性读取文件的所有内容write方法:将指定内容写入文件close方法:关闭文件file对象的属性flie.name文件的名称file.mode文件的访问模式file.closed

springboot读取外部配置文件

springboot项目打成jar包后不好进行配置文件修改,可设置为读取外部配置文件,方便进行配置修改.步骤:1.将jar包中的application.properties配置文件复制到自定义路径下;2.运行jar包命令指定外部配置文件路径:nohupjavajar.jarspring.config.location

java多种文件复制方式以及效率比较

1.背景java复制文件的方式其实有很多种,可以分为传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream传统的字符流读写复制FileReader,FileWriter,BufferWriter,Buffered

Java 读取Properties文件时应注意的路径问题

1\.使用Class的getResourceAsStream()方法读取Properties文件(资源文件)的路径问题:      InputStreaminthis.getClass().getResourceAsStream("资源Name");    注意:    (1)这种方式要求Properties资源文件必须与当

Sublime text 3 个人设置配置注释

1,复制一份原始配置文件把sublimetextpreferencesSettingsDefault文件里的所有内容都复制到sublimetextpreferencesSettingsUser文件里,2,配置注释:// Place your settings