2011-09-30

来源:互联网 发布:node web 编辑:程序博客网 时间:2024/05/17 01:21
 

一、缓冲字符流

1、缓冲字符流出现的原因:FileReader对象,每次调用read()方法进行读操作时,都会直接去文件汇总读取字节,转换成字符并返回,这样频繁的读取文件效率很低。 缓冲字符流的出现就是为了提高效率。

2、缓冲字符的构造方法:

public BufferedReader(Reader in);//创建一个使用默认大小输入缓冲区的缓冲字符输入流。

public BufferedReader(Reader in, int sz);//创建一个使用给定大小输出缓冲区的新缓冲字符输入流。如果sz小于等于0,将抛出IllegalArgumentException异常。

public BufferedWriter(Writer out) ;//与输入流一样

public BufferedWriter(Writer out, int sz); //与输入流一样

二、实例

1、FileWriter fw=null;

   BufferedWriter bw=null;

   try {

      fw = new FileWriter("demo.txt");//字符的输出流,数据的写入

      bw = new BufferWriter(fw);//构建缓冲的字符流,对已有流的封装

      bw.write("hell0");

      bw.newLine();//增加换行符

      bw.write("java");

      bw.newLine();

      bw.flush();//把缓冲区的内容刷新到目的地

   }

2、import java.io.*;

public class MyBufferedReader {

   //类的属性,代表普通 的字符输入流对象,修饰的对象

   private Reader r;//利用自己类的父类可以接受子类,从而体现多态性

   //构造方法

   static int n=1;

   public  MyBufferedReader(Reader r){//体现多态性

      this.r=r;

   }

   //readLine()方法:实现的功能是读一行,增加缓冲区,然后调用r对象的read()读取字符放在缓冲区中,

   //当读到行标记时,就把缓冲区中的字符中的字符转换成字符串返回

   public String readLine(){

      //缓冲区

      StringBuffer strB = new StringBuffer();

      int ch = 0;

      try {

        while((ch=r.read())!=-1){

           //'\r'和'\n'是回车换行,只有在两个都存在时才可实现

           if(ch=='\r'){

              continue;

           }

           if(ch=='\n'){

              return (n++)+"\t"+new String(strB);// 等价  strB.toString()

           }else{

              strB.append((char)ch);//追加放置在缓冲区里

           }

        }

      } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

      //当读到最后一行的时候,判断最后一行是否到结尾,是否有字符返回。

      if((strB.length())!=0){

        return new String(strB);

      }

      return null;

   }

   //close()方法

   public void close(){

      try {

        r.close();

      } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

   }

}

三、装饰设计模式和继承的区别

   装饰设计模式比继承有更好的灵活性。因为装饰模式和继承相比,继承中的类在建立缓冲字符流时,是在每次使用时建立一个,这样的重复性会很大,如果用装饰模式,可以只建立一个类,只要在使用时调用它就行了。就好比是抽象类、接口一样,把共同的东西提前出来。

   当然,每个事物都是有两方面的,有优点必定有缺点。

出现的新的问题:该类虽然完成对已有两个对象的增强。但是当有新的对象出现时,还要继续在该类中添加构造函数。这样不利于扩展和维护。