4种复制文件的方式性能比较

最近工作中涉及到了文件的下载,于是就想寻找一种最快的方式,考虑到在不考虑网络因素的情况下,下载和文件的复制其实可以理解为
一回事,本次测试中使用了4种方式

硬件如下

jdk 7

代码如下:

public class FileDownloader {

    public static void copyFileUsingStream(File source, File dest) throws IOException {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(source);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } finally {
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }
    }

    public static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
        FileUtils.copyFile(source, dest);
    }

    public static void copyFileUsingJava7Files(File source, File dest) throws IOException {
        Files.copy(source.toPath(), dest.toPath());
    }

    public static void copyFileUsingChannel(File source, File dest) throws IOException {
        FileChannel sourceChannel = null;
        FileChannel destChannel = null;
        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destChannel = new FileOutputStream(dest).getChannel();
            destChannel.transferFrom(sourceChannel, 0, Long.MAX_VALUE);
        } finally {
            IOUtils.closeQuietly(sourceChannel);
            IOUtils.closeQuietly(destChannel);
        }
    }

}

测试代码如下:

public class FileDownloaderTest {

    private File source;

    private File dest;

    @Test
    public void testCopyFileUsingStream() throws Exception {
        source = new File("e://1.avi");
        dest = new File("d://1.avi");

        long start = System.nanoTime();
        FileDownloader.copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = " + (System.nanoTime() - start));
    }

    @Test
    public void testCopyFileUsingApacheCommonsIO() throws Exception {
        source = new File("e://2.avi");
        dest = new File("d://2.avi");
        long start = System.nanoTime();
        FileDownloader.copyFileUsingApacheCommonsIO(source, dest);
        System.out.println("Time taken by Apache Commons IO Copy = " + (System.nanoTime() - start));
    }

    @Test
    public void testCopyFileUsingJava7Files() throws Exception {
        source = new File("e://3.avi");
        dest = new File("d://3.avi");
        long start = System.nanoTime();
        FileDownloader.copyFileUsingJava7Files(source, dest);
        System.out.println("Time taken by Java7 Files Copy = " + (System.nanoTime() - start));
    }

    @Test
    public void testCopyFileUsingChannel() throws Exception {
        source = new File("e://4.avi");
        dest = new File("d://4.avi");
        long start = System.nanoTime();
        FileDownloader.copyFileUsingChannel(source, dest);
        System.out.println("Time taken by Channel Copy = " + (System.nanoTime() - start));
    }
}

测试方法:

将同样的文件,在原始目录下,复制4份,文件名不同,文件一摸一样。然后多次执行测试代码。

做了2组测试,每组执行了3次,结果如下:

文件大小:98.3M

Time taken by Apache Commons IO Copy = 64954135
Time taken by Stream Copy = 375539829
Time taken by Channel Copy = 57012898
Time taken by Java7 Files Copy = 65101591

Time taken by Apache Commons IO Copy = 63818085
Time taken by Stream Copy = 375973711
Time taken by Channel Copy = 57417522
Time taken by Java7 Files Copy = 65688487

Time taken by Apache Commons IO Copy = 63172674
Time taken by Stream Copy = 354136258
Time taken by Channel Copy = 58497984
Time taken by Java7 Files Copy = 79916185

文件大小:746M

Time taken by Apache Commons IO Copy = 660830180
Time taken by Stream Copy = 2791359285
Time taken by Channel Copy = 3861113037
Time taken by Java7 Files Copy = 6162249000

Time taken by Apache Commons IO Copy = 381343255
Time taken by Channel Copy = 2987676936
Time taken by Stream Copy = 2856878081
Time taken by Java7 Files Copy = 19034765260

Time taken by Apache Commons IO Copy = 419664709
Time taken by Stream Copy = 2761465029
Time taken by Channel Copy = 4183763748
Time taken by Java7 Files Copy = 23261100925

结论 nio 方式比较快

时间: 2024-10-31 22:53:39

4种复制文件的方式性能比较的相关文章

4种java复制文件的方式_java

尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法.复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候.然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式. 1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是第一个方法的代码: private static void copyFileUsin

网站建设中PHP的编程8种常见文件操作

 文件和目录的操作  PHP处理本地服务器上的文件和目录是非常方便的,但有时候会出现权限和路径相关的问题  1.打开文件  resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )  $handle = fopen(filename,mode)//打开文件,返回代表此文件的资源的句柄  文件名称可以使用相对路径或者绝对路径也可以使用网络协议模式,打开模式具有rr+

java复制文件的4种方式

尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式. ###1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是第一个方法的代码: private static void copyFi

windows xp系统移动和复制文件与文件夹的多种方式及操作步骤

移动是指将所选文件或文件夹移动到指定位置,而复制是指为所选文件或文件夹创建副本.下面系统之家小编就來介绍移动和复制文件或文件夹的方法. 1.使用任务窗格 步骤1:在windows xp系统中,打开放置文件或文件夹的磁盘窗口,选中需要移动或复制的文件或文件夹,然后在"文件和文件夹任务"任务窗格中单击"移动所选项目"或"复制所选项目"链接(参见图1),打开"移动项目"或"复制项目"对话框. 步骤2:在"

Beyond Compare比较文件内容方式有几种?

  Beyond Compare比较文件内容方式有几种?          具体操作步骤如下所示 步骤一:打开Beyond Compare软件,在主页面左侧新建会话目录中选择"文件夹同步"会话,打开会话操作界面.分别单击界面两侧"浏览文件夹"按钮,选择您需要同步的两份文件夹. 步骤二:单击文件夹同步菜单栏"会话"按钮,在展开的下拉菜单中选择"会话设置"选项,打开"会话设置-文件夹同步"窗口,并且切换到&qu

阿里云NAS文件存储:性能型、容量型、NAS Plus如何选

阿里云NAS文件存储:性能型.容量型.NAS Plus如何选? 阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例.HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展.单一命名空间.多共享.高可靠和高可用等特性的分布式文件系统. 为了满足用户业务对NAS文件存储的各种需求,阿里云NAS文件系统目前有3种类型可供用户选择,他们分别是: 性能型 容量型 NAS Plus 如上图所示

你所未知的3种Node.js代码优化方式_node.js

Node.js 程序的运行可能会受 CPU 或输入输出操作的限制而十分缓慢.从 CPU 角度看,程序运行缓慢的典型原因之一就是未经优化的「热点路径」(一段经常被访问的代码).从输入输出角度看,程序运行速度的局限可能是受底层操作系统影响,也可能是出于 Node 本身的故障.更或者,一个运行缓慢的程序可能跟 Node 本身没有任何关系,问题在于外部资源,比如数据库查询或是 API 调用缓慢,未经过优化处理. 在本文中,我们将重点识别并优化代码库中会导致 CPU 繁重运行的操作.同时,将探讨生产应用的

5种Android数据存储方式汇总_Android

本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种:使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比

XML数据读取方式性能比较(一)

原文:XML数据读取方式性能比较(一) 几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了.现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较过这些方式各有哪些特点或优劣.正好看到网上也没有这方面的实验,偶来总结一下. 测试开始先读取XML源,用一个比较大的RSS文件链接,复制到项目bin/debug目录下. Stream xmlStream =new MemoryStream(File.ReadAllBytes(path));   一.