第十二章 java流与文件操作 第二讲

来源:互联网 发布:夏普打印机网络打印机 编辑:程序博客网 时间:2024/04/30 13:20

第十二章  java流与文件操作  第二讲

二  缓冲字符流的应用  BufferedReader BufferedWriter

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

2. 缓冲字符流的优点:是为了提高效率。

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

4. 缓冲字符的构造方法:

     public BufferedReader(Reader in);

         注意:参数ReaderBufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性。

public BufferedReader(Reader in,int sz);

    注意:int sz是制定缓冲区的内存容量

public BufferedWriter(Writer out) ;

public BufferedWriter(Writer out,int sz);

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

           FileWriterfw=null;

          BufferedWriter bw=null;

            try {

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

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

             bw.write("hell0");

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

             bw.write("java");

             bw.newLine();

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

           }

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

          public StringreadLine();

          public void newLine();

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

           FileReader fr = null;

           BufferedReader br= null;

             try {

                 fr=newFileReader("res/demo.txt");

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

                 String str= null;

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

                 System.out.print(str);

              }

   7.在懂得缓冲流方法中的readLine()的原理后,可以根据原理自己创建一个缓冲流的类,下面是一个缓冲流类的实例:

     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 = newStringBuffer();

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

           // TODOAuto-generated catch block

          e.printStackTrace();

       }

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

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

           return newString(strB);

       }

       return null;

    }

    //close()方法

    public void close(){

       try {

           r.close();

       } catch (IOException e) {

           // TODOAuto-generated catch block

          e.printStackTrace();

       }

    }

}

8.装饰设计模式和继承的区别

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

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

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

二 缓冲字符流的应用  BufferedReader  BufferedWriter

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

2. 缓冲字符流的优点:是为了提高效率。

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

4. 缓冲字符的构造方法:

     public BufferedReader(Reader in);

         注意:参数Reader是BufferedReader的父类,只要是Reader的子类都可以传过来,体现了类的多态性。

public BufferedReader(Reader in, int sz);

    注意:int sz 是制定缓冲区的内存容量

public BufferedWriter(Writer out) ;

public BufferedWriter(Writer out, int sz);

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

           FileWriter fw=null;

          BufferedWriter bw=null;

            try {

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

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

             bw.write("hell0");

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

             bw.write("java");

             bw.newLine();

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

           }

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

          public StringreadLine();

          public void newLine();

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

           FileReader fr = null;

           BufferedReader br= null;

              try{

                 fr=newFileReader("res/demo.txt");

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

                 String str= null;

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

                 System.out.print(str);

              }

   7.在懂得缓冲流方法中的readLine()的原理后,可以根据原理自己创建一个缓冲流的类,下面是一个缓冲流类的实例:

     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 = newStringBuffer();

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

           // TODOAuto-generated catch block

          e.printStackTrace();

       }

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

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

           return newString(strB);

       }

       return null;

    }

    //close()方法

    public void close(){

       try {

           r.close();

       } catch (IOException e) {

           // TODOAuto-generated catch block

          e.printStackTrace();

       }

    }

}

8.装饰设计模式和继承的区别

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

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

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

 

原创粉丝点击