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

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

首先来说明如何使用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就相当于运输工具,开始时定义的大小影响着拷贝文件的效率。

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

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

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

运行一下

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

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

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

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

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

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

实现方法与类似

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

运行一下

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

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

09-16 04:55