BufferedInputStream、BufferedOutputStream分别继承自FilterInputStream、FilterOutputStream而FilterInputStream、FilterOutputStream又是继承于InputStream、OutputStream的抽象类,那么首先来看看InputStream和OutputStream。
InputStream的作用是用来表示那些从不同数据源产生输入的类,这些数据源包括:1)字节数组。2)String对象。3)文件。4)管道,工作方式与实际管道相似,即从一端输入,另一端输出。5)一个由其他种类的流组成的序列,以便我们可以将它们收集合并到一个流内。6)其他数据源。每一种数据源都有相应的InputStream子类,如ByteArrayInputStream、FileInputStream等。FilterInputStream也属于一种InputStream,为“装饰器”(decorator)类提供基类,其中,“装饰器”类可以把属性或有用的接口与输入流链接在一起。(可参考设计模式:装饰器模式)
OutputStream类型,该类别的类决定了输出索要去往的目标:字节数组(不是String),文件或管道。其子类有FileOutputStream、FilterOutputStream等,同样,FilterOutputStream为“装饰器”类提供了一个基类。
FilterInputStream和FilterOutputStream分别自I/O类库中的基类InputStream和OutputStream派生而来,这两个类是装饰器的必要条件。
1.通过FilterInputStream从InputStream读取数据
FilterInputStream能够完成两件不同的事情,其中,DataInputStream允许读取不同的基本类型数据以及String对象(所有方法都以read开头,如readByte()、readFloat()等),相应搭配DataOutputStream。其他FilterInputStream则在内部修改InputStream的行为方式:是否缓冲、是否保留它所读过的行等,如BufferedInputStream。
2.通过FilterOutputStream向OutStream写入
DataOutputStream将以各种基本数据类型以及String对象格式化输出到流中,这样以来,任何机器上的任何DataInputStream都能读取他们,所有方法都以write开头,如writeByte()...等等。
BufferedOutputStream是一个修改过的OutputStream,它对数据流使用缓冲技术,当每次向流写入时,不必每次都进行实际的物理写入动作,在输出时,可能更经常的使用它。
Reader和Writer类
首先要搞清楚的是,这两个类并不是用来替代InputStream和OutputStream的类,InputStream和OutputStream是以面向字节形式,而Reader和Writer则提供兼容Unicode与面向字符的I/O功能。
需要注意的是:有时需要把来自“字节”层次结构中的类和“字符”层次结构中的类结合起来使用。这里需要用到适配器(adapter,参考设计模式:适配器模式)类:InputsStreamReader和OutputStreamWriter。前者可以把InputStream转换为Reader,后者可以吧OutputStream转换为Writer。
还有一点需要注意:BufferedOutputStream是FilterOutputStream的子类,但BufferedWriter并不是FilterWriter的子类。
有一点很清楚:无论我们何时使用readLine(),都不应该使用DataInputStream,应该使用BufferedReader()。除了这一点,DataInputStreamStream仍是I/O类库的首选成员。