NIO 拷贝文件真的比 IO 效率高 ?
本文是基于单线程的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 效率高 ?相关推荐
- linux 文件拷贝io,NIO拷贝文件真的比IO拷贝文件效率高?
今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑NIO拷贝文件真的如其他人说的那样比IO效率高很多么? 以下是我的工具方法: / ...
- java nio拷贝文件_Java 7 – NIO文件革命
java nio拷贝文件 Java 7("项目代币")已于去年7月问世. 此版本中的新增功能很有用,例如,尝试资源-从try块中自动处理可关闭的资源,switch语句中的字符串,用 ...
- java中BufferedInputStream缓存为什么使IO效率高?
背景 最近在看socket编程,这里面需要用到stream进行数据的读取和写入.于是代码中用到了BufferedInputStream提高读的效率.所以就一直在想为什么加上buffer就能提高效率了, ...
- 快速删除node_modules文件夹方法(效率高、无延迟)
当前端项目安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法. 方法一:使用rimraf模块的命令 在全局安装r ...
- mmap拷贝文件与用常规文件IO拷贝文件效率对比
通常我们读写文件时,都是用系统提供的write和read函数,但是我们都知道文件IO函数操作文件流效率要低于mmap,因为mmap相对write/read省去将数据拷贝到用户态的操作.那么他们之间 ...
- jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...
- 五.Java IO、NIO、文件、通讯
2019独角兽企业重金招聘Python工程师标准>>> Java 的 I/O 大概可以分成四组: 基于字节操作的 I/O :InputStream 和 OutputStream 基于 ...
- Stream流、FiLe和IO流、IO流(字节流-拷贝文件_和_字符流-读取文本中的数据写入文本文件中)9-10-11
package com.streamdemo; import java.util.ArrayList; import java.util.List; /*** 体验Stream流** 创建一个集合,存 ...
- NIO详解以及NIO的文件IO操作
一.NIO概述 java.nio全称java non-blockingIO,是指JDK1.4开始提供的新API.从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即Ne ...
最新文章
- 火电电厂相关业务知识
- CentOS 初体验九:curl 的使用
- 装了Ubuntu后将默认启动项修改为windows
- 到底什么是API经济
- hdu1520 (树形dp)
- 十大优秀 Windows开放源代码软件简介
- QT学习之做一个简易图片处理器(后续补全)
- 法拉科机器人编程软件_发那科机器人编写简单的程序教程
- 申论该怎么学?申论作文如何提高
- 推荐:HP大中华区总裁孙振耀退休十五天后九大感言
- 恶意程序行为特征总汇
- 2.4G无线模块(NRF24L01)学习(2)——单片机互相控制LED灯
- Python:实现pigeon sort鸽巢算法(附完整源码)
- java jframe 切换_java – 在JFrame中切换面板
- 创业者周鸿祎前传(西安交大时期)-看点-@虎嗅网
- Apache ShenYu源码阅读系列-基于ZooKeeper的数据同步
- XX系统功能用例整体设计思路
- 【PR 基础】PR界面简介
- onedrive手机客户端_OneDrive手机版
- 【视频】结构方程模型SEM分析心理学营销数据路径图可视化|数据分享
热门文章
- 1 SQL server数据库基础
- Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析(上)...
- Unity The Type Matching Rule
- 打造高效机房就这么简单(一)
- java使用ssh连接Linux并执行命令
- 为UC做准备:部署Exchange 2010及SP1
- 后台参数验证的几种方式
- Extjs Form用法详解(适用于Extjs5)
- Delphi 复习代码
- 肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”