zoukankan      html  css  js  c++  java
  • Java I/O流 复制文件速度对比

    Java I/O流 复制文件速度对比

    截屏2020-09-13 18.41.21

    首先来说明如何使用Java的IO流实现文件的复制:

    第一步肯定是要获取文件

    这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之)

    FileInputStream fis = new FileInputStream("copyFileName.format");// 用于读取文件

    FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用于生成文件,若文件不存在,则会新生成

    第二步得到文件后就要进行复制

    由第一步可知我们用的是字节流,所以我们使用byte[] 进行搬运数据

    byte[] buffer = new btye[5];
    int len;
    // read(btye[] b)会对文件进行读取,将数据填入 b 中,并返回读取数量,如读取完毕返回 -1
    while	((len = fis.read(buffer)) != -1) { 
      	fos.write(buffer, 0, len); // 将读取的数据写入文件中
    }
    

    第三步也是最重要的一步,关闭文件

    fos.close();
    fis.close();
    

    明白上述步骤后我们来看完整的代码

    public void copyFile() throws IOException{ // 这里可能会抛出异常
      FileInputStream fis = new FileInputStream("copyFileName.format"); // 用于读取文件
      FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用于生成文件
    
      byte[] buffer = new byte[5];
      int len;
      while ((len = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, len);
      }
    
      fos.close();
      fis.close();
    }
    

    假设我们需要运一堆沙子到工地,使用摩托车和卡车的速度是不一样,即使摩托车开的比卡车快,但是一次的载货量太少,需要不停的往返,而卡车一次能搬运不少,只需几次就可以将沙子搬完。

    这里buffer就相当于运输工具,开始时定义的大小影响着拷贝文件的效率。

    我们来做一个测试,检验一下:

    截屏2020-09-14 12.41.13

    截屏2020-09-14 09.09.48

    运行一下

    截屏2020-09-14 09.11.36

    可以看出数组容量的增大,对于复制速度的提升是巨大。

    既然如此为什么不尽可能的大呢?

    是因为数组开辟是需要占用内存的,并不是越大越好。

    所以我们常用1024来设定数组的大小,这样不至于复制效率太慢也不至于占用内存过多。

    其实,我们还可以使用BufferedInputStreamBufferedOutputStreamFileInputStreamFileOutputStream进行包装,能够大大提升复制的效率。

    实现方法与类似

    截屏2020-09-14 12.30.36

    运行一下

    截屏2020-09-14 12.35.45

    可以用BufferedInputStreamBufferedOutputStreamFileInputStreamFileOutputStream进行包装,即使buffer的容量为5也比第一测试时,用1024复制的要快。

  • 相关阅读:
    烂泥:学习ubuntu之快速搭建LNMP环境
    烂泥:学习ubuntu远程桌面(二):远程桌面会话管理
    烂泥:学习ubuntu远程桌面(一):配置远程桌面
    烂泥:学习ssh之ssh密钥随身携带
    烂泥:学习ssh之ssh无密码登陆
    JS 获取浏览器窗口大小
    connect() failed (111: Connection refused) while connecting to upstream的解决
    css加载没效果,查看网络显示类型为 text/plain 的解决方法
    empty和isset的区别
    SQLite3命令操作大全
  • 原文地址:https://www.cnblogs.com/Code-CHAN/p/13666018.html
Copyright © 2011-2022 走看看