java.nio transferTo似乎速度很快? [英] java.nio transferTo seems to be impossibly fast?

查看:322
本文介绍了java.nio transferTo似乎速度很快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以解释一下transferTo方法如何以看似1000+ MB/秒的速度复制文件.我使用372MB的二进制文件运行了一些测试,并且第一个副本很慢,但是如果我更改输出名称并再次运行它,则输出目录中的另一个文件会在180毫秒之内出现,结果超过2000 MB秒这里发生了什么?我正在运行Windows 7.

Can someone please explain how the transferTo method can copy a file at seemingly 1000+ MB/sec. I ran some tests using a 372MB binary file and the first copy is slow, but if I change the output name and run it again, an additional file appears in the output directory in as little as 180ms, which works out to over 2000 MB/sec. What's going on here? I'm running Windows 7.

private static void doCopyNIO(String inFile, String outFile) {
    FileInputStream     fis = null;
    FileOutputStream    fos = null;
    FileChannel         cis = null;
    FileChannel         cos = null;

    long                len = 0, pos = 0;

    try {
        fis = new FileInputStream(inFile);
        cis = fis.getChannel();
        fos = new FileOutputStream(outFile);
        cos = fos.getChannel();
        len = cis.size();
        while (pos < len) {
            pos += cis.transferTo(pos, (1024 * 1024 * 10), cos);    // 10M
        }
        fos.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cos != null) { try { cos.close(); } catch (Exception e) { } }
        if (fos != null) { try { fos.close(); } catch (Exception e) { } }
        if (cis != null) { try { cis.close(); } catch (Exception e) { } }
        if (fis != null) { try { fis.close(); } catch (Exception e) { } }
    }
}

推荐答案

这里的键是第一次".您的操作系统已将整个文件缓存在RAM中(如今372MB已不多了),因此唯一的开销就是将零拷贝缓冲区移过内存映射空间所需的时间.如果刷新缓存(不知道如何在Windows上执行此操作;如果文件位于外部驱动器上,则可以拔出并重新插入),您将看到它稳定下来以读取速率,并且如果您强制操作系统执行以下操作:刷新写入,如果您有硬盘,您的程序将阻塞10秒钟左右.

The key there is "first time". Your OS has cached the entire file in RAM (372MB isn't much these days), and so the only overhead is the time required to flip the zero-copy buffers through the memory-mapped space. If you flush the cache (don't know how to do that on Windows; if the file's on an external drive, you could unplug and replug), you'll see that settle down to read rates, and if you force the OS to flush the writes, your program will block for 10 seconds or so if you have a hard disk.

这篇关于java.nio transferTo似乎速度很快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆