目录
一、使用字节缓冲流
BufferedInputStream和BufferedOutputStream称为字节缓冲流,使用字节缓冲流内置了一个缓冲区,第 一次调用read方法时尽可能多地从数据源读取数据到缓冲区,后续再到用read方法时先看看缓冲区中是 否有数据,如果有则读缓冲区中的数据,如果没有再将数据源中的数据读入到缓冲区,这样可以减少 直接读数据源的次数。通过输出流调用write方法写入数据时,也先将数据写入到缓冲区,缓冲区满了 之后再写入数据目的地,这样可以减少直接对数据目的地写入次数。使用了缓冲字节流可以减少I/O操 作次数,提高效率。
BufferedInputStream的父类是FilterInputStream,BufferedOutputStream的父类是 FilterOutputStream,FilterInputStream和FilterOutputStream称为过滤流。过滤流的作用是扩展其他流, 增强其功能。那么BufferedInputStream和BufferedOutputStream增强了缓冲能力。
过滤流实现了装饰器(Decorator)设计模式,这种设计模式能够在运行时扩充一个类的功 能。而继承在编译时扩充一个类的功能。
BufferedInputStream和BufferedOutputStream中主要方法都是继承自InputStream和OutputStream。下面介绍一下它们的构造方法。
BufferedInputStream构造方法主要有:
- BufferedInputStream(InputStream in):通过一个底层输入流in对象创建缓冲流对象,缓冲区大小 是默认的,默认值8192。
- BufferedInputStream(InputStream in, int size):通过一个底层输入流in对象创建缓冲流对象,size 指定的缓冲区大小,缓冲区大小应该是2的n次幂,这样可提供缓冲区的利用率。
BufferedOutputStream构造方法主要有:
- BufferedOutputStream(OutputStream out):通过一个底层输出流out 对象创建缓冲流对象,缓冲区 大小是默认的,默认值8192。
- BufferedOutputStream(OutputStream out, int size):通过一个底层输出流out对象创建缓冲流对象, size指定的缓冲区大小,缓冲区大小应该是2的n次幂,这样可提高缓冲区的利用率。
案例代码如下:
import java.io.*;
public class FileCopyWithBuffer {
public static void main(String[] args) {
// 创建文件输入流,底层流,通过它构造缓冲输入流
try(FileInputStream in = new FileInputStream("/Users/caizhengjie/Desktop/qq/123.txt");
BufferedInputStream bis = new BufferedInputStream(in);
FileOutputStream out = new FileOutputStream("/Users/caizhengjie/Desktop/qq/asd/1234.txt");
// 构造缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(out)){
// 开始时间
long starttime = System.nanoTime();
// 准备一个缓冲区,这个缓冲区与缓冲区内置的缓冲区不同,决定是否进行I/O操作的次数的是缓冲区内置的缓冲区,不是次缓冲区
byte[] buffer = new byte[1024];
// 首先读取一次
int len = bis.read(buffer);
while (len!=-1){
// 开始写入数据
bos.write(buffer,0,len);
// 再读取一次
len = bis.read(buffer);
}
// 结束时间
long elapsedTime = System.nanoTime()-starttime;
System.out.println("耗时"+(elapsedTime/1000000.0)+"毫秒");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行时间:
耗时0.030161毫秒
FileCopy与FileCopyWithBuffer复制相同文件src.zip,缓冲区buffer都设置1024
FileCopy运行时间:
耗时0.246213毫秒
由此可见使用缓冲流的FileCopyWithBuffer明显要比不使 用缓冲流的FileCopy速度快。
以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!