前面一篇,我们知道的拷贝文件的方法都是一个一个字节读,然后一个一个字节写入文件,这样的拷贝方式效率很低。这篇,我们来学习一个字节数组拷贝方法,效率相对来说,提高了很多。这个原理是这样的,输入流读取文件到一个字节数组中,然后输出流把这个字节数组的数据写入到文件。
1.代码演示
还是模拟上一篇的一个比较小的mp4的文件拷贝。下面代码中available是一个获取字节长度的方法,例如一个文件有1024个字节,通过available返回的int的值就是1024.在FileInputStream有一个read(byte[] arr)的方法,用来把读取的字节放到一个字节数组中去;在FileOutputStream类下有一个write(byte[] arr)的方法,用来把字节数组写入到文件。代码如下。
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo3_CopyFile {
public static void main(String[] args) throws IOException {
//1.创建输入流对象
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test.mp4");
//2.创建输出流对象
FileOutputStream fos = new FileOutputStream("copy.mp4");
//创建一个字节数组,大小和文件字节大小一致
byte[] arr = new byte[fis.available()];
// 文件输入流,把读取字节统一放在字节数组中
fis.read(arr);
// 文件输出流,把字节数组中数据写入到文件
fos.write(arr);
fis.close();
fos.close();
}
}
这个时候,运行,发现几秒之内就把文件拷贝到当前项目根目录下,确实比上一篇介绍的方法要效率提高了很多。但是,这个是有一个条件限制的,Java程序是运行在Java虚拟机上,JVM虚拟机需要一些内存才可以运行起来。加入说读取的文件数据太大,例如十几个G的高清电影,通过这种字节数组去拷贝,一定会遇到内存溢出的情况。所以,这种方式,在实际开发代码中并不是使用很多。后面还会介绍更好的文件拷贝方法。