Java I/O流 复制文件速度对比
首先来说明如何使用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
就相当于运输工具,开始时定义的大小影响着拷贝文件的效率。
我们来做一个测试,检验一下:
运行一下
可以看出数组容量的增大,对于复制速度的提升是巨大。
既然如此为什么不尽可能的大呢?
是因为数组开辟是需要占用内存的,并不是越大越好。
所以我们常用1024
来设定数组的大小,这样不至于复制效率太慢也不至于占用内存过多。
其实,我们还可以使用BufferedInputStream
和BufferedOutputStream
对FileInputStream
和FileOutputStream
进行包装,能够大大提升复制的效率。
实现方法与类似
运行一下
可以用BufferedInputStream
和BufferedOutputStream
对FileInputStream
和FileOutputStream
进行包装,即使buffer
的容量为5
也比第一测试时,用1024
复制的要快。