当前位置: 首页 > 编程语言 > Java > 正文

Java编程那些事儿90——装饰流使用1

时间:2010-03-15 csdn 陈跃峰

11.3.3 装饰流使用

除了按照流的方向可以把流划分为输入流和输出流两类,按照流读写数据的基本单位把流划分为字节流和字符流两类以外,还可以按照流是否直接连接实际数据源,例如文件、网络、字节数组等,将流又可以划分为实体流和装饰流两大类。

其中实体流指直接连接数据源的流类,如前面介绍的FileInputStream/FileOutputStream和FileReader和FileWriter,该类流直接实现将数据源转换为流对象,在实体流类中实现了流和数据源之间的转换,实体流类均可单独进行使用。

而装饰流指不直接连接数据源,而是以其它流对象(实体流对象或装饰流对象)为基础建立的流类,该类流实现了将实体流中的数据进行转换,增强流对象的读写能力,比较常用的有DataInputStream/DataOutputStream和BufferedReader/BufferedWriter等,装饰流类不可以单独使用,必须配合实体流或装饰流进行使用。

由于装饰流都是在已有的流对象基础上进行创建的,所以这种创建流的方式被称作“流的嵌套”,通过流的嵌套,可以修饰流的功能,例如使读写的速度增加或者提供更多的读写方式,方便数据格式的处理。

装饰流不改变原来实体流对象中的数据内容,只是从实体流对象基础上创建出的装饰流对象相对于实体流对象进行了一些功能的增强。

流的嵌套是学习IO编程时必须掌握的知识,使用它才可以让你真正体会到IO类设计时的设计思路,也可以方便的使用IO类。

下面分别以DataInputStream/DataOutputStream和BufferedReader/BufferedWriter为例子,详细介绍装饰类的使用。

11.3.3.1 DataInputStream/DataOutputStream

在前面的示例中,在向流中写入的数据必须首先转换为byte数组或char数组,当写入的数据比较少、比较简单时,则向流中写入数据时还是不是很麻烦的,但是如果向流中写入数据比较多时,手动转换数据格式则会比较麻烦。当然,很多文件都是根据文件存储的需要设计了专门的存储格式,但是这些格式一般都比较复杂,需要阅读专门的格式文档才可以读写这些特定格式的文件。

为了简化程序员对于流的操作,使得程序员可以从繁杂的数据格式中解脱出来,在IO类中专门设计了两个类——DataInputStream/DataOutputStream类简化流数据的读写,使用这两个类,可以实现以增强型的读写方法读写数据,使得读写流的数据变得比较简单。

在实际使用这两个类时,必须匹配起来进行使用。也就是说,只有使用DataOutputStream流格式写入的数据,在实际读取时才可以使用DataInputStream进行读取。因为在使用DataOutputStream向流中写入数据时,除了写入实际的数据内容以外,还写入了特定的数据格式,该格式对于程序员来说是透明的,这种特定的格式不需要程序员熟悉,而只需要使用DataInputStream读取即可,读取时的顺序和写入时的顺序和类型保持一致即可。

在DataInputStream类中,增加了一系列readXXX的方法,例如readInt、readUTF、readBoolean等等,而在DataOutputStream类中,也增加了一系列writeXXX的方法,例如writeInt、writeUTF、writeBoolean等等,使得对于数据的读写更加方便很容易。

下面以读写文件为例子,演示DataInputStream/DataOutputStream类的基本使用。

/**

* 模拟需要存储到文件中的数据

* 该类中保存4种类型的数据

*/

public class MyData {

 boolean b;

 int n;

 String s;

 short sh[];

 public MyData(){}

 public MyData(boolean b,int n,String s,short sh[]){

  this.b = b;

  this.n = n;

  this.s = s;

  this.sh = sh;

 }

}