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

2020-05-08 23:32:23 +08:00
 zhao1014

代码如下:

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

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

1179 次点击
所在节点    问与答
12 条回复
zhao1014
2020-05-08 23:32:56 +08:00
格式乱了不好意思,将就看下
misaka19000
2020-05-08 23:36:20 +08:00
也许是超过了磁盘或者内存或者 CPU 的缓存或者超过了磁盘或者 CPU 的快大小
xupefei
2020-05-08 23:52:38 +08:00
一个簇是 4096 字节。
1024 的 buffer 在没有 read ahead 的时候是浪费磁盘 IO 。
楼主多试几个 4096 的倍数?
xupefei
2020-05-08 23:56:18 +08:00
我仔细看了看代码,fis.read 每次读一个字节,你设置的 buffer 大小有意义吗
whitev2
2020-05-09 00:22:38 +08:00
Files.copy() 不香么?
zhao1014
2020-05-09 00:26:13 +08:00
@xupefei 新手上路,刚刚学到这里🥺
zhao1014
2020-05-09 00:26:58 +08:00
@whitev2 就是不太理解为什么会这样
zhao1014
2020-05-09 00:29:06 +08:00
@xupefei 我没注意!太脑瘫了。。
zhao1014
2020-05-09 00:32:07 +08:00
@xupefei 我把代码改了,1024 时用时 8 毫秒,
102400000 用时 175 毫秒,你说的簇我还不太懂应该是我没学到的地方,我查查资料学习一下。谢谢回答!
zhao1014
2020-05-09 00:35:02 +08:00
@xupefei 测试 4096 和 409600000 的时候也是大的字节数组读写的速度慢,但是 4096 比 1024 快很多,40960 比 4096 快一点,数组过大读写速度反而会慢了,不太理解为什么。
doudouwu
2020-05-09 10:44:01 +08:00
@zhao1014 你得先确定你这样能把图片 copy 到另一个文件再确定其他的
doudouwu
2020-05-09 11:07:29 +08:00
瞎了,没看到更正

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/669832

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX