设为首页 加入收藏

TOP

NIO拷贝文件真的比IO拷贝文件效率高?
2014-11-23 22:59:18 来源: 作者: 【 】 浏览:6
Tags:NIO 拷贝 文件 真的 效率

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


以下是我的工具方法:


/**
*
* 通过NIO进行文件拷贝
* @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();
}

/**
*
* 使用IO拷贝文件
* @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次:76799
public 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肯定比其他的要高效很多。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C#图像添加高斯噪声和椒盐噪声及.. 下一篇Java的char类型真的可以存汉字么?

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: