void close()前面介绍的字节流和字符流,因为没有使用缓冲区等其他原因,一般不直接使用。在实际编程过程中,这些对象的引用还要传入到装饰类中去,动态地给这些对象增加额外的功能,形成新的对象,这些新的对象才是实际需要的字节流和字符流对象,这个过程同时也说明了装饰器模式是使用的。装饰类的使用如下所示:

      void close()缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能。以字符缓冲流为例进行说明,字符缓冲流从字符流中读取、写入字符,不立刻要求系统进行处理,而是缓冲部分字符,从而实现按规定字符数、按行等方式的高效的读取或写入。缓冲流缓冲区的大小可以指定(通过缓冲流构造方法指定),也可以使用默认的大小,多数情况下默认大小已够使用。

      void close()通过一个输入字符流和输出字符流创建输入字符缓冲流和输出字符缓冲流的代码如下。

      void close()输入字符缓冲流类和输出字符缓冲流类的方法和输入字符流类和输出字符流类的方法类似,下面通过一个例子来演示缓冲流的使用。

      void close()有些情况下,不是非要等到缓冲区满,才向文件系统写入。例如在处理一些关键数据时,需要立刻将这些关键数据写入文件系统,这时则可以调用flush()方法,手动刷新缓冲流。另外,在关闭流时,也会自动刷新缓冲流中的数据。

      void close()flush()方法的作用就是刷新该流的缓冲。如果该流已保存缓冲区中各种write()方法的所有字符,则立即将它们写入预期目标。如果该目标是另一个字符或字节流,也将其刷新。因此,一次flush()调用将刷新Writer和OutputStream链中的所有缓冲区。

      void close()假设有这样的需求:使用一个输入字符缓冲流读取用户在命令行输入的一行数据。

      void close()分析这个需求,首先得知需要用输入字符缓冲流读取数据,我们想到了使用刚才学习的BufferedReader这个类。其次,需要获取的是用户在命令行输入的一行数据,通过之前的学习可以知道,System.in是InputStream类(字节输入流)的静态对象,可以从命令行读取数据字节。现在问题出现了,需要把一个字节流转换成一个字符流。在此可以使用InputStreamReader和OutputStreamWriter这两个类来进行转换。

      void close()刚才提到的将字节流转换为字符流,实际上使用了一种设计模式——适配器模式。适配器模式的意图是将一个类的接口转换成客户希望的另外一个接口,该模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

      void close()数据流,简单来说就是容许字节流直接操作基本数据类型和字符串。

      void close()假设程序员使用整型数组types存储车型信息(1代表轿车、2代表卡车),用数组names、oils、losss和others分别存储车名、油量、车损度和品牌(或吨位)的信息。现要求使用数据流将数组信息存到数据文件data中,并从数据文件中读取数据,用来输出车辆信息。

      void close()编译、运行程序,其运行结果如图4.7所示。


    图4.7 使用数据流存取车辆信息