黑马程序员技术交流社区

标题: IO流--字符流缓冲区 [打印本页]

作者: 洛奇亚    时间: 2015-9-18 23:08
标题: IO流--字符流缓冲区
字符流缓冲区

1、缓冲区的出现提高了对数据的读取效率。
缓冲区原理:
   其实就是从源中获取一批数据装进缓冲区中。
   从缓冲区中不断的取出一个一个数据。
   在此次取完后,从源中继续取一批数据进缓冲区。
   当源中的数据取光后,用-1作为结束标志。  

2、对应类:
       BufferedWriter
       BufferedReader

3、缓冲区要结合流才可以使用。

4、输出——字符流缓冲区
package com.buffered;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderDemo {
       
        public static void main(String[] args) throws IOException {
               
                FileReader fr= new FileReader("buf.txt");
               
               
                //输出——字符流缓冲区
                BufferedReader bufr=new BufferedReader(fr);
               
                String line =null;
               
                while((line=bufr.readLine())!=null){
                       
                        System.out.println(line);
                       
                }
                       
                bufr.close();
        }
        /**
         * @throws FileNotFoundException
         * @throws IOException
         */
        public static void Demo() throws FileNotFoundException, IOException {
                FileReader fr=new FileReader("buf.txt");
       
                char[] arr=new char[1024];
               
                fr.read();
               
                int len=0;
               
                while((len=fr.read(arr))!=-1){
                       
                        System.out.println(new String (arr,0,len));
                       
                }
               
                fr.close();
        }
}

5、字符写入流的缓冲区
package com.buffered;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
       
        private static final String BUFFER_SIZE = System.getProperty("line.separator");
        public static void main(String[] args) throws IOException {
               
                FileWriter fw= new FileWriter("buf.txt");
               
                //为了提高写入的效率。使用了字符流的缓冲区。
                //创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联。
                BufferedWriter bufw =new BufferedWriter(fw);
               
                //使用缓冲区的写入方法将数据先写入到缓冲区中。
        //        bufw.write("sfdsvsa"+BUFFER_SIZE+"nhasfsdvf");
                bufw.write("sadsfdbgn");
               
                bufw.newLine();//换行
               
                bufw.write("sadfb");
               
                for(int x=1;x<=4;x++){
                       
                        bufw.write("abcdef"+x);
                        bufw.newLine();
                        bufw.flush();
                       
                }
                //使用缓冲区的刷方法将数据刷到目的地中。
                bufw.flush();
               
                //关闭缓冲区。其实关闭的就是被缓冲的流对象。
                bufw.close();
               
        }
}

6、使用缓冲区,提高读取效率
package com.buffered;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTextBufferTest {
       
        public static void main(String[] args) throws IOException {
               
                FileReader fr=new FileReader("buf.txt");
               
                BufferedReader bufr=new BufferedReader(fr);
               
                FileWriter fw =new FileWriter("buf_copy.txt");
               
                BufferedWriter bufw =new BufferedWriter(fw);
               
               
                //行读的方式
               
                String line =null;
               
                while((line=bufr.readLine())!=null){
                       
                        bufw.write(line);
                       
                        bufw.newLine();
                       
                        bufw.flush();
       
                }
                               
                bufw.close();
               
                bufr.close();
       
        }
}

7、装饰设计模式:
             对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。

    装饰和继承都能实现一样的特点:进行功能的扩展增强;
    区别是:装饰比继承灵活。
       (1)  首先有一个继承体系;
             Writer
                     |--TextWriter:用于操作文本   
                     |--MediaWriter:用于操作媒体  

        (2) 想要对操作的动作进行效率的提高;
                   按照面向对象,可以通过继承对具体的进行功能的扩展。
                   装饰: 效率提高需要加入缓冲技术。

          Writer
                     |--TextWriter:用于操作文本   
                                |--BufferTextWriter:加入了缓冲区技术的操作文本的对象。
                     |--MediaWriter:用于操作媒体  
                                |--BufferMediaWriter:加入了缓冲区技术的操作媒体的对象。

特点:装饰类和被装饰类都必须所属同一个接口或者父类。

装饰思想——装饰器设计模式
package cn.itcast.p5.wrapper;
public class PersonDemo {
       
        public static void main(String[] args) {
               
                Person p= new Person();
               
                //p.chifan();
               
                NewPerson p1=new NewPerson(p);
               
                p1.chifan();
               
        }
}
class Person{
        void chifan(){
                System.out.println("吃饭");
        }
}
//装饰思想——装饰器设计模式。
//这个类的出现是为了增强person而出现的。
class NewPerson{
        private Person p;
       
        NewPerson(Person p){
                this.p=p;
        }
       
        public void chifan(){
               
                System.out.println("开胃酒");
               
                p.chifan();
               
                System.out.println("甜点");
        }
       
}

8、lineNumber:读行号
package cn.itcast.p6.io.linenumber;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/*
* lineNumber:读行号
*/
public class LineNumberReaderDemo {
       
        public static void main(String[] args) throws IOException {
               
                FileReader fr=new FileReader("buf.txt");
               
                LineNumberReader lnr=new LineNumberReader(fr);
               
                String line =null;
               
                lnr.setLineNumber(2);//从第几行开始
               
                while((line=lnr.readLine())!=null){
                        System.out.println(lnr.getLineNumber()+":"+line);
                }
               
                lnr.close();
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2