• java复制文件的4种方式


    尽管Java提供了一个可以处理文件的IO操作类。
    但是没有一个复制文件的方法。
    复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。
    然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。

    ###1. 使用FileStreams复制
    这是最经典的方式将一个文件的内容复制到另一个文件中。
    使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。
    这是第一个方法的代码:

    privatestaticvoid copyFileUsingFileStreams(File source,File dest)throwsIOException{InputStream input =null;OutputStream output =null;try{
            input =newFileInputStream(source);
            output =newFileOutputStream(dest);byte[] buf =newbyte[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方法,根据文档应该比文件流复制的速度更快。
    这是第二种方法的代码:

    privatestaticvoid copyFileUsingFileChannels(File source,File dest)throwsIOException{FileChannel inputChannel =null;FileChannel outputChannel =null;try{
            inputChannel =newFileInputStream(source).getChannel();
            outputChannel =newFileOutputStream(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());}
    
    

    ###测试
    现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。
    从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。
    让我们看一下代码:

    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;publicclassCopyFilesExample{publicstaticvoid main(String[] args)throwsInterruptedException,IOException{File source =newFile("C:\Users\nikos7\Desktop\files\sourcefile1.txt");File dest =newFile("C:\Users\nikos7\Desktop\files\destfile1.txt");// copy file using FileStreamslong 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 =newFile("C:\Users\nikos7\Desktop\files\sourcefile2.txt");
            dest =newFile("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 =newFile("C:\Users\nikos7\Desktop\files\sourcefile3.txt");
            dest =newFile("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 =newFile("C:\Users\nikos7\Desktop\files\sourcefile4.txt");
            dest =newFile("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));}privatestaticvoid copyFileUsingFileStreams(File source,File dest)throwsIOException{InputStream input =null;OutputStream output =null;try{
                input =newFileInputStream(source);
                output =newFileOutputStream(dest);byte[] buf =newbyte[1024];int bytesRead;while((bytesRead = input.read(buf))>0){
                    output.write(buf,0, bytesRead);}}finally{
                input.close();
                output.close();}}privatestaticvoid copyFileUsingFileChannels(File source,File dest)throwsIOException{FileChannel inputChannel =null;FileChannel outputChannel =null;try{
                inputChannel =newFileInputStream(source).getChannel();
                outputChannel =newFileOutputStream(dest).getChannel();
                outputChannel.transferFrom(inputChannel,0, inputChannel.size());}finally{
                inputChannel.close();
                outputChannel.close();}}privatestaticvoid copyFileUsingJava7Files(File source,File dest)throwsIOException{Files.copy(source.toPath(), dest.toPath());}privatestaticvoid copyFileUsingApacheCommonsIO(File source,File dest)throwsIOException{FileUtils.copyFile(source, dest);}}
    
    

    ####输出:

    Time taken by FileStreamsCopy=127572360Time taken by FileChannelsCopy=10449963Time taken by Java7FilesCopy=10808333Time taken by ApacheCommons IO Copy=17971677
    
    

    正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。
    这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。 

     
  • 相关阅读:
    JQuery中的AJAX
    (十六)JQuery Ready和angularJS controller的运行顺序问题
    Excel自己定义纸张打印设置碰到无法对上尺寸的问题
    MVC整个样例的源代码
    将Image转化为BufferImage
    Graphics samples2
    Graphics samples
    please tell me the error about java Graphics
    获取网络资源大小
    java通过地址获取主机名
  • 原文地址:https://www.cnblogs.com/krislight1105/p/5092702.html
Copyright © 2020-2023  润新知