java.io学习总结
我将按照基类的顺序:InputStream、OutPutStream、Reader、Writer来分别对Java I/O加以总结。
。。。。。整理中
java中的流,简单理解就是管道里有流水,这个管道连接了程序和文件。
InputStream、OutPutStream是字节输入流的所有类的超类。
Reader、Writer是字符输入流的所有类的超类。
Java IO流对象(其实大家都和懂啦,我这里再赘述一下)
1.输入字节流InputStreamIO 中输入字节流的继承图可见上图,可以看出:
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据。
ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。
2.输出字节流OutputStream
IO 中输出字节流的继承图可见上图,可以看出:
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责。与生成子类相比,它更具有灵活性。用我的理解就是当流经过输入输出的管道时候给它添加一些额外的功能。(装饰模式和继承有什么区别呢?这个后续讨论)下面的图来自《Head first design patterns》中装饰者模式一章

Component为组件和装饰的公共父类,它定义了子类必须实现的方法。
ConcreteComponent是一个具体的组件类,可以通过给它添加装饰来增加新的功能。
Decorator是所有装饰的公共父类,它定义了所有装饰必须实现的方法,同时,它还保存了一个对于Component的引用,以便将用户的请求转发给Component,并可能在转发请求前后执行一些附加的动作。
ConcreteDecoratorA和ConcreteDecoratorB是具体的装饰,可以使用它们来装饰具体的Component.
众人皆知java的输入输出包"java.io"是一个装饰者模式的典型案例,这从下面这小段代码就可以大致看出:
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("d:tina.txt"));/** * @author tina.wyn * */class MyInputStream extends FilterInputStream {protected MyInputStream(InputStream in) {super(in);}public int read() throws IOException {int c = super.read();return (c == -1 ? c : Character.toLowerCase((char) c));}public int read(byte[] b, int offset,int len)throws IOException{int result = super.read(b, offset, len);for(int i = offset;i<offset+result;i++){b[i] = (byte) Character.toLowerCase((char)b[i]);}return result;}}public class InputTest{public static void main(String[] args) throws IOException{int c;try {InputStream in = new MyInputStream(new BufferedInputStream(new FileInputStream("d:/tina.txt")));while ((c = in.read())!=-1) {System.out.print((char)c);}in.close();} catch (IOException e) {}}}