缓冲流 BufferedReader 和BufferedWriter
1.字节流和字符流存在的缺陷
- 字节流、字符流都是无缓冲的输入、输出、那么每次的读、写操作都会给操作系统处理,这样的作法可能会对系统的性能造成很大的影响,因为每次操作都可能引发磁盘硬件的读、写或者是网络的访问,这些磁盘硬件读、写和网络访问会占用大量的系统资源,影响效率
- 缓冲流、转换流、数据流,这些流的底层都遵循着一个相同的设计模式 -> 装饰器模式
- 装饰器模式就是通过方法,将对象逐步进行包装
- 比如:字节输出流 FileOutputStream 对象放在缓冲输出流 BufferedOutputStream 类构造方法之后,就变成了一个缓冲输出流 BufferedOutputStream 对象:
BufferedOutpotStream bos = new BufferOutputStream(new FileOutputStream(...))
- 比如:缓冲输出流对象如果又传到了数据流 DataOutputSream 类的构造方法中,就又变成了一个数据流 DataOutputStream 对象:
DataOutputStream out = new DataOutputStream(bos)
-
注意:装饰器模式在语法上要求包装类和被包装类属于同一个继承体系,并且包装后外观不变,但是功能得到增强
- 比如上例中:BufferedOutputStream 和 DataOutputStream 都继承自 OutputStream 类,所以三者都是通过 OutputStream 提供的 write()方法进行统一的行写操作
- 功能增强表示的是 FileOutputStream 对象在被 BufferedOutputStream 构造方法包装之后。就变成了一个 BufferedOutputStream 对象,而这个对象提供了比未包装的对象有更丰富的API
-
缓冲流的目的是让原字节流、字符流增加缓冲的功能,字符缓冲流从字符流中读取、写入字符,不立马要求系统处理,而是缓冲部分字符,从而实现按规定字符数、按行等方式的高效读取或写入
-
缓冲区的大小是可以指定的,通过缓冲流的构造方法,也可以使用默认的大小,大多数情况下默认的大小就已经足够
-
通过一个输入字符流和输出字符流创建输入字符缓冲流和输出字符缓冲流:
BufferedReader in = new BufferedReader(new FileReader("car.java"))
BufferedWriter out = new BufferedWriter(new FileWriter("Truck.java"))
- 输入字符缓冲流类和输出字符缓冲流类的方法与输入字符流类和输出字符流类的方法类似