本文是基于单线程的nio和io拷贝文件比较, 并未对并发做测试, 请勿过度纠结场景!
今天发现项目中有个fileutils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于nio的, 突然疑虑nio拷贝文件真的如其他人说的那样比io效率高很多么?
以下是我的工具方法:
以下是测试方法:
第一次我找了个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肯定比其他的要高效很多。