缓冲流讲解

来源:互联网 发布:双11淘宝每年销售额 编辑:程序博客网 时间:2024/06/08 18:41

      今天讲解了缓冲流BufferedReader BufferedWriter。

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

2.就是对数组进行封装。因为在运用缓冲的过程中,在读取时是在调用read(),当调用的字符已满所定的内存时,就会封装成数组去访问磁盘文件。

3. BufferedReader(Reader in);:参数Reader是BufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性

   BufferedReader(Reader in,int sz); int sz 是制定缓冲区的内存容量

4.对缓冲字符流的实例的部分代码:----红色部分是会缓冲流的创建

       FileWriterfw=null;

         BufferedWriterbw=null;

            try {

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

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

              bw.write("hell0");

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

              bw.write("java");

              bw.newLine();

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

 5. 缓冲字符流有几个特有的方法:

          public String readLine();

          public void newLine();

          对readLine()方法的使用的部分代码:

            FileReader fr = null;

           BufferedReader br = null;

              try {

                  fr=new FileReader("res/demo.txt");

                  br = newBufferedReader(fr,255);//255指定缓冲区

                  String str= null;

                  while((str=br.readLine())!=null){

                  System.out.print(str);

               }

6.了解readLine()方法的原理,自己创建一个类,来实现这个操作。

public class MyBufferedReader {

    //属性

    private Reader r;

    //构造方法

    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){

                if(ch=='\r')

                    continue;

                if(ch=='\n'){

                    //当这行结束了

                    return new String(strB);

                }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();

        }

    }

}

7.装饰设计模式

装饰设计模式比继承有更好的灵活性

A)继承:通过所学的继承特性,可以建立MediaWriter类的子类和TextWriter类的子类,在子类中重写父类的write方法即可

增加的这些子类都是在使用缓冲技术。可不可以对缓冲技术进行描述,将需要增强的对象传递给缓冲区即可。

B)要继续在该类中添加构造函数。这样不利于扩展和维护。如

         BufferedWriter(MediaWriter mw){}

         BufferedWriter(TextWriter mw){}

    解决方式。利用Java语言的多态来解决。用父类Writer作为参数

原创粉丝点击