目录
前言
我们在使用字节流操作文件时,每次读写操作都需要花费一定的时间,在练习的时侯,测试的文件一般来说都比较小,感觉不到花的时间,但是如果文件大了,操作的时候就会感觉到花费的时间多了,所以在字节流的基础上就衍生出了一类文件读写高效的流——缓冲流。
缓冲流
概述
缓冲流就是字节流加了buff,相对字节流来说更强了。
字节缓冲流
字节缓冲流有BufferedInputStream和BufferedOutputStream,用于操作字节。
字符缓冲流
字符缓冲流有BufferedReader和BufferedWriter,用于操作字符。
实现原理
在创建缓冲流对象的时候同时创建一个默认的缓冲区数组,通过缓冲区读写,减少读写次数,从而提高效率。
字节流复制文件
现在我需要把我的电脑里面F盘下的“孙子从美国来 2012.rmvb”文件复制C:\Users\DLHLD\Desktop目录下,先看使用字节流复制的演示代码:
//使用字节流复制视频
public static void stream() throws IOException {
//获取系统当前时间作为复制开始时的时间
long startTime = System.currentTimeMillis();
//创建FileInputStream对象,用于从文件读取数据
FileInputStream fis = new FileInputStream("F:孙子从美国来 2012.rmvb");
//创建FileOutputStream对象,用于写出数据到文件
FileOutputStream fos = new FileOutputStream("C:\\Users\\DLHLD\\Desktop\\孙子从美国来 2012.rmvb");
//边读编写
byte [] bytes = new byte[1024];
while(fis.read(bytes) != -1){
fos.write(bytes);
}
//关闭流对象
fis.close();
fos.close();
//获取系统当前时间作为复制结束后的时间
long endTime = System.currentTimeMillis();
System.out.println("使用字节流复制视频的时间:"+(endTime-startTime)+"ms");
}
运行结果:
花费时间28秒左右,文件大小1.24 GB (1,332,086,625 字节)
缓冲流复制文件
这里先要把目录C:\Users\DLHLD\Desktop下的文件孙子从美国来 2012.rmvb先删除,随后再操作,看测试代码:
//使用缓冲流复制视频
public static void bufferStream() throws IOException {
//获取系统当前时间作为复制开始时的时间
long startTime = System.currentTimeMillis();
//创建BufferedInputStream对象,用于从文件读取数据
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:孙子从美国来 2012.rmvb"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\DLHLD\\Desktop\\孙子从美国来 2012.rmvb"));
byte [] bytes = new byte[1024];
while (bis.read(bytes) != -1){
bos.write(bytes);
}
//关闭流对象
bis.close();
bos.close();
//获取系统当前时间作为复制结束后的时间
long endTime = System.currentTimeMillis();
System.out.println("使用缓冲流复制视频的时间:"+(endTime-startTime)+"ms");
}
运行结果:
只花了3.1秒,速度差不多是十倍了。
总结
在需要操作大文件的时候,可以使用缓冲流,不过也要慎用,节省的时间都是用空间换来的。