打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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.3MTime taken by Apache Commons IO Copy = 64954135Time taken by Stream Copy = 375539829Time taken by Channel Copy = 57012898Time taken by Java7 Files Copy = 65101591Time taken by Apache Commons IO Copy = 63818085Time taken by Stream Copy = 375973711Time taken by Channel Copy = 57417522Time taken by Java7 Files Copy = 65688487Time taken by Apache Commons IO Copy = 63172674Time taken by Stream Copy = 354136258Time taken by Channel Copy = 58497984Time taken by Java7 Files Copy = 79916185文件大小:746MTime taken by Apache Commons IO Copy = 660830180Time taken by Stream Copy = 2791359285Time taken by Channel Copy = 3861113037Time taken by Java7 Files Copy = 6162249000Time taken by Apache Commons IO Copy = 381343255Time taken by Channel Copy = 2987676936Time taken by Stream Copy = 2856878081Time taken by Java7 Files Copy = 19034765260Time taken by Apache Commons IO Copy = 419664709Time taken by Stream Copy = 2761465029Time taken by Channel Copy = 4183763748Time taken by Java7 Files Copy = 23261100925

结论 nio 方式比较快

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java复制文件的4种方式
FTP获取根目录下的所有子文件
VMware Communities: Sysprep.inf
可变参数列表之va
Ftp与NFS服务器端上传和下载
走近Guava(七): 文件操作
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服