V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhao1014
V2EX  ›  问与答

不懂就问, Java 中文件复制速度的问题。

  •  
  •   zhao1014 · 2020-05-08 23:32:23 +08:00 · 1271 次点击
    这是一个创建于 1661 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    public class copy { public static void main(String[] args) throws IOException { long s = System.currentTimeMillis();

        FileInputStream fis = new FileInputStream("C:\\Users\\ZZY\\Desktop\\JavaNote\\02-Java 语言进阶\\原理图\\哈希表.png");
        FileOutputStream fos = new FileOutputStream("C:\\Users\\ZZY\\Desktop\\哈希表.png");
    
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = fis.read()) != -1){
            fos.write(bytes,0,len);
        }
    
        
        fos.close();
        fis.close();
    
        long e =  System.currentTimeMillis();
        System.out.println("文件输出耗时" + (e-s) + "毫秒" );
    }
    

    }

    字节数组长度设置为 1024 是用时 3295 长度为 10240000 时用时 2942 长度为 1024000000 时用时 3485

    图片大小是 52mb

    为什么数组长度变大了,读取时间反而是长→短→更长呢?

    第 1 条附言  ·  2020-05-09 00:38:49 +08:00
    更正 fis.read(bytes)。
    更正后测试 1024 是 8 毫秒,10240 是 3 毫秒,102400000 是 181 毫秒。

    4096 是 4 毫秒,40960 是 2 毫秒,4096000 是 9 毫秒,409600000 是 613 毫秒
    12 条回复    2020-05-09 11:07:29 +08:00
    zhao1014
        1
    zhao1014  
    OP
       2020-05-08 23:32:56 +08:00
    格式乱了不好意思,将就看下
    misaka19000
        2
    misaka19000  
       2020-05-08 23:36:20 +08:00
    也许是超过了磁盘或者内存或者 CPU 的缓存或者超过了磁盘或者 CPU 的快大小
    xupefei
        3
    xupefei  
       2020-05-08 23:52:38 +08:00 via iPhone
    一个簇是 4096 字节。
    1024 的 buffer 在没有 read ahead 的时候是浪费磁盘 IO 。
    楼主多试几个 4096 的倍数?
    xupefei
        4
    xupefei  
       2020-05-08 23:56:18 +08:00 via iPhone   ❤️ 1
    我仔细看了看代码,fis.read 每次读一个字节,你设置的 buffer 大小有意义吗
    whitev2
        5
    whitev2  
       2020-05-09 00:22:38 +08:00
    Files.copy() 不香么?
    zhao1014
        6
    zhao1014  
    OP
       2020-05-09 00:26:13 +08:00 via Android
    @xupefei 新手上路,刚刚学到这里🥺
    zhao1014
        7
    zhao1014  
    OP
       2020-05-09 00:26:58 +08:00 via Android
    @whitev2 就是不太理解为什么会这样
    zhao1014
        8
    zhao1014  
    OP
       2020-05-09 00:29:06 +08:00 via Android
    @xupefei 我没注意!太脑瘫了。。
    zhao1014
        9
    zhao1014  
    OP
       2020-05-09 00:32:07 +08:00 via Android
    @xupefei 我把代码改了,1024 时用时 8 毫秒,
    102400000 用时 175 毫秒,你说的簇我还不太懂应该是我没学到的地方,我查查资料学习一下。谢谢回答!
    zhao1014
        10
    zhao1014  
    OP
       2020-05-09 00:35:02 +08:00 via Android
    @xupefei 测试 4096 和 409600000 的时候也是大的字节数组读写的速度慢,但是 4096 比 1024 快很多,40960 比 4096 快一点,数组过大读写速度反而会慢了,不太理解为什么。
    doudouwu
        11
    doudouwu  
       2020-05-09 10:44:01 +08:00
    @zhao1014 你得先确定你这样能把图片 copy 到另一个文件再确定其他的
    doudouwu
        12
    doudouwu  
       2020-05-09 11:07:29 +08:00
    瞎了,没看到更正
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2956 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:08 · PVG 08:08 · LAX 16:08 · JFK 19:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.