Java IO :拷贝文件的四种方式

尽管Java提供了可以操作文件的类java.io.File,但是没有一个把一个文件拷贝到另一个文件的专门的copy方法。当你在对文件进行一些相关操作的时候,copy是很常见的一种行为。这样,我们看看Java的几种copy方式:

代码如下所示:



// 1:使用FileStreams进行copy
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[] buff = new byte[1024];
        int byteRead;
        while ((byteRead = input.read(buff)) > 0) {
            output.write(buff, 0, byteRead);
        }
    } finally {
        input.close();
        output.close();
    }
}

// 2:使用java.nio.channels.FileChannel拷贝文件
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:使用Apache Commons IO拷贝文件
private static void copyFileUsingApacheCommonsIO(File source, File dest)
        throws IOException {
    FileUtils.copyFile(source, dest);// 包括文件夹和文件以及URL等方式,按照具体情况选择
}

// 4:使用Java7文件类拷贝文件
private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

分析:
第一种方式:传统的文件流方式,当处理大数据量的文件读写的时候,性能比较差
第二种方式:NIO 的Channel 比传统的文件流方式要快
第三种方式: Apache Commons IO,代码简洁,使用方便,而且内部原理也是NIO实现的
第四种方式:Java 7的Files类,同样效果不错。

案例测试:

<!--
    public static void main(String[] args) throws IOException {
    File source = new File("C:\\Users\\bin\\Desktop\\sudojs\\book.rar");
    File dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile1.rar");

    // 使用FileStreams拷贝
    long start = System.nanoTime();
    copyFileUsingFileStreams(source, dest);
    long end = System.nanoTime();
    System.out.println("使用FileStreams 拷贝文件耗费的时间 = " + (end - start));

    // 使用java.nio.FileChannel拷贝
    // source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
    dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile2.rar");
    start = System.nanoTime();
    copyFileUsingFileChannels(source, dest);
    end = System.nanoTime();
    System.out.println("使用java.nio.FileChannel 拷贝文件耗费的时间 = "
            + (end - start));

    // 使用Java 7 Files类进行拷贝
    // source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
    dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile3.rar");
    start = System.nanoTime();
    copyFileUsingFileChannels(source, dest);
    end = System.nanoTime();
    System.out.println("使用Java 7 Files拷贝文件耗费的时间 = " + (end - start));

    // 使用commons io拷贝文件
    // source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
    dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile4.rar");
    start = System.nanoTime();
    copyFileUsingFileChannels(source, dest);
    end = System.nanoTime();
    System.out.println("使用commons io拷贝文件耗费的时间 = " + (end - start));
}

输出结果
使用FileStreams 拷贝文件耗费的时间 = 118337822492
使用java.nio.FileChannel 拷贝文件耗费的时间 = 74341638792
使用Java 7 Files拷贝文件耗费的时间 = 77163306057
使用commons io拷贝文件耗费的时间 = 68317497911

使用的文件大小如下图:
Java IO :拷贝文件的四种方式_第1张图片

文件大小为1.73G左右(还不算太大,大点效果更明显 ),那么根据测试结果发现:Commons IO最快,其次是NIO的Channel,然后是Java7的Files,最差的是FileStreams。当然具体的使用要根据具体情况安排,这里只做一个参考。

你可能感兴趣的:(Java IO :拷贝文件的四种方式)