本文是基于单线程的NIO和IO拷贝文件比较, 并未对并发做测试, 请勿过度纠结场景!

今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么?

以下是我的工具方法:

/*** * <p>通过NIO进行文件拷贝</p>* @param fromFile    被拷贝的文件* @param toFile    拷贝后的文件* @throws IOException */public static void copy(String fromFile, String toFile) throws IOException {FileInputStream inputStream = new FileInputStream(fromFile);FileChannel fromChannel = inputStream.getChannel();FileOutputStream outputStream = new FileOutputStream(toFile);FileChannel toChannel   = outputStream.getChannel();toChannel.transferFrom(fromChannel, 0, fromChannel.size());
//        fromChannel.transferTo(0, fromChannel.size(), toChannel);toChannel.force(true);inputStream.close();fromChannel.close();outputStream.close();toChannel.close();}/*** * <p>使用IO拷贝文件</p>* @param fromFile        被拷贝的文件* @param toFile        拷贝后的文件* @throws IOException*/public static void copyByIO(String fromFile, String toFile) throws IOException {File inputFile = new File(fromFile);File outputFile = new File(toFile);FileInputStream inputStream = new FileInputStream(inputFile);FileOutputStream outputStream = new FileOutputStream(outputFile);byte[] bytes = new byte[1024];int c;while ((c = inputStream.read(bytes)) != -1)outputStream.write(bytes, 0, c);inputStream.close();outputStream.close();}

以下是测试方法:

@Test//8.72M文本文件-->拷贝100次: 8781        1000次:101564//4.65G压缩包同文件夹拷贝1次:136160        跨盘拷贝1次:147363    public void testCopyNIO() {String from = "d:/test/test.zip";Long start = System.currentTimeMillis();try {for(int i=0;i<1;i++) {String to   = "e:/test/test"+i+".zip";FileUtils.copy(from, to);}} catch (IOException e) {e.printStackTrace();}Long end = System.currentTimeMillis();System.out.println(end-start);}@Test//8.72M文本文件-->拷贝100次: 7719        1000次:109051//4.65G压缩包同文件夹拷贝1次:103261        跨盘拷贝1次:76799public void testCopyIO() {String from = "d:/test/test.zip";Long start = System.currentTimeMillis();try {for(int i=0;i<1;i++) {String to   = "e:/test/test"+i+".zip";FileUtils.copyByIO(from, to);}} catch (Exception e) {e.printStackTrace();}Long end = System.currentTimeMillis();System.out.println(end-start);}

第一次我找了个sysbase通过bcp命令导出的数据文件, 大小为8718KB, 使用以上两个测试方法, 分别拷贝了100次, 发现NIO执行时间为8781毫秒,IO执行时间为7719毫秒, NIO输了。

第二次我将拷贝次数改成了1000, 发现NIO执行时间为101564毫秒,IO执行时间为109051毫秒, NIO赢了, 但也仅仅赢了不到8秒。

第三次我将数据文件复制打包再复制再打包最后做出一个4,650,673KB大小的压缩包, 由于磁盘空间问题, 这次我只执行了1次, 发现NIO执行时间为136160毫秒,IO执行时间为103261毫秒, NIO输了33秒。

我又怀疑同一个文件夹下面拷贝可能没有突出NIO的优势,于是我又做了第四次测试, 换了个磁盘, 结果发现NIO执行时间为147363毫秒,IO执行时间为76799毫秒, NIO输了更惨, 耗费时间足足是IO的两倍。

可见NIO虽然在很多方面比IO强,但是这也并不是绝对的。

以上只是针对NIO和普通IO的简单测试, 并没有深究文件拷贝, 有兴趣的兄弟可以去研究下通过BufferedInputStream和RandomAccessFile来进行文件拷贝。其中RandomAccessFile效率应该和FileInputStream差不多, BufferedInputStream肯定比其他的要高效很多。

NIO 拷贝文件真的比 IO 效率高 ?相关推荐

  1. linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?

    今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么? 以下是我的工具方法: / ...

  2. java nio拷贝文件_Java 7 – NIO文件革命

    java nio拷贝文件 Java 7("项目代币")已于去年7月问世. 此版本中的新增功能很有用,例如,尝试资源-从try块中自动处理可关闭的资源,switch语句中的字符串,用 ...

  3. java中BufferedInputStream缓存为什么使IO效率高?

    背景 最近在看socket编程,这里面需要用到stream进行数据的读取和写入.于是代码中用到了BufferedInputStream提高读的效率.所以就一直在想为什么加上buffer就能提高效率了, ...

  4. 快速删除node_modules文件夹方法(效率高、无延迟)

    当前端项目安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法. 方法一:使用rimraf模块的命令 在全局安装r ...

  5. mmap拷贝文件与用常规文件IO拷贝文件效率对比

      通常我们读写文件时,都是用系统提供的write和read函数,但是我们都知道文件IO函数操作文件流效率要低于mmap,因为mmap相对write/read省去将数据拷贝到用户态的操作.那么他们之间 ...

  6. jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...

  7. 五.Java IO、NIO、文件、通讯

    2019独角兽企业重金招聘Python工程师标准>>> Java 的 I/O 大概可以分成四组: 基于字节操作的 I/O :InputStream 和 OutputStream 基于 ...

  8. Stream流、FiLe和IO流、IO流(字节流-拷贝文件_和_字符流-读取文本中的数据写入文本文件中)9-10-11

    package com.streamdemo; import java.util.ArrayList; import java.util.List; /*** 体验Stream流** 创建一个集合,存 ...

  9. NIO详解以及NIO的文件IO操作

    一.NIO概述 java.nio全称java non-blockingIO,是指JDK1.4开始提供的新API.从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即Ne ...

最新文章

  1. 火电电厂相关业务知识
  2. CentOS 初体验九:curl 的使用
  3. 装了Ubuntu后将默认启动项修改为windows
  4. 到底什么是API经济
  5. hdu1520 (树形dp)
  6. 十大优秀 Windows开放源代码软件简介
  7. QT学习之做一个简易图片处理器(后续补全)
  8. 法拉科机器人编程软件_发那科机器人编写简单的程序教程
  9. 申论该怎么学?申论作文如何提高
  10. 推荐:HP大中华区总裁孙振耀退休十五天后九大感言
  11. 恶意程序行为特征总汇
  12. 2.4G无线模块(NRF24L01)学习(2)——单片机互相控制LED灯
  13. Python:实现pigeon sort鸽巢算法(附完整源码)
  14. java jframe 切换_java – 在JFrame中切换面板
  15. 创业者周鸿祎前传(西安交大时期)-看点-@虎嗅网
  16. Apache ShenYu源码阅读系列-基于ZooKeeper的数据同步
  17. XX系统功能用例整体设计思路
  18. 【PR 基础】PR界面简介
  19. onedrive手机客户端_OneDrive手机版
  20. 【视频】结构方程模型SEM分析心理学营销数据路径图可视化|数据分享

热门文章

  1. 1 SQL server数据库基础
  2. Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析(上)...
  3. Unity The Type Matching Rule
  4. 打造高效机房就这么简单(一)
  5. java使用ssh连接Linux并执行命令
  6. 为UC做准备:部署Exchange 2010及SP1
  7. 后台参数验证的几种方式
  8. Extjs Form用法详解(适用于Extjs5)
  9. Delphi 复习代码
  10. 肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”