三、缓冲区

三、缓冲区

  1. 字符流的缓冲区:BufferedReader和BufferedWreiter
  • 缓冲区的出现时为了提高流的操作效率而出现的.
  • 需要被提高效率的流作为参数传递给缓冲区的构造函数
  • 在缓冲区中封装了一个数组,存入数据后一次取出
    BufferedReader示例:
    读取流缓冲区提供了一个一次读一行的方法readline,方便对文本数据的获取。
    readline()只返回回车符前面的字符,不返回回车符。如果是复制的话,必须加入newLine(),写入回车符
    newLine()是java提供的多平台换行符写入方法。

[java] view plain copy

  1. import java.io.*;
  2. class BufferedReaderDemo {
  3.  public static void main(String[] args)  throws IOException {  
    
  4.      //创建一个字符读取流流对象,和文件关联  
    
  5.      FileReader rw = new FileReader("buf.txt");  
    
  6.     //只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可  
    
  7.     BufferedReader brw = new BufferedReader(rw);  
    
  8.     for(;;) {  
    
  9.         String s = brw.readLine();  
    
  10.         if(s==null) break;  
    
  11.         System.out.println(s);  
    
  12.     }  
    
  13.     brw.close();//关闭输入流对象  
    
  14. }  
    
  15. }

BufferedWriter示例:

[java] view plain copy

  1. import java.io.*;
  2. class BufferedWriterDemo {
  3.  public static void main(String[] args)  throws IOException {  
    
  4.      //创建一个字符写入流对象  
    
  5.      FileWriter fw = new FileWriter("buf.txt");  
    
  6.     //为了提高字符写入效率,加入了缓冲技术。  
    
  7.     //只要将需要被提高效率的流作为参数传递给缓冲区的构造函数即可  
    
  8.     BufferedWriter bfw = new BufferedWriter(fw);  
    
  9.     //bfw.write("abc\r\nde");  
    
  10.     //bfw.newLine();               这行代码等价于bfw.write("\r\n"),相当于一个跨平台的换行符  
    
  11.     //用到缓冲区就必须要刷新  
    
  12.     for(int x = 1; x < 5; x++) {  
    
  13.         bfw.write("abc");  
    
  14.         bfw.newLine();                  //java提供了一个跨平台的换行符newLine();  
    
  15.         bfw.flush();  
    
  16.     }  
    
  17.     bfw.flush();                                                //刷新缓冲区  
    
  18.     bfw.close();                                                //关闭缓冲区,但是必须要先刷新  
    
  19.     //注意,关闭缓冲区就是在关闭缓冲中的流对象  
    
  20.     fw.close();                                                 //关闭输入流对象  
    
  21. }  
    
  22. }

2.装饰设计模式
装饰设计模式::::
要求:自定义一些Reader类,读取不同的数据(装饰和继承的区别)
MyReader //专门用于读取数据的类
|–MyTextReader
|–MyBufferTextReader
|–MyMediaReader
|–MyBufferMediaReader
|–MyDataReader
|–MyBufferDataReader

如果将他们抽取出来,设计一个MyBufferReader,可以根据传入的类型进行增强
class MyBufferReader {

MyBufferReader (MyTextReader text) {}
MyBufferReader (MyMediaReader media) {}
MyBufferReader (MyDataReader data) {}

}

但是上面的类拓展性很差。找到其参数的共同类型,通过多态的形式,可以提高拓展性

class MyBufferReader extends MyReader{
private MyReader r; //从继承变为了组成模式 装饰设计模式
MyBufferReader(MyReader r) {}
}

优化后的体系:
|–MyTextReader
|–MyMediaReader
|–MyDataReader
|–MyBufferReader //增强上面三个。装饰模式比继承灵活,
避免继承体系的臃肿。降低类与类之间的耦合性

装饰类只能增强已有的对象,具备的功能是相同的。所以装饰类和被装饰类属于同一个体系

MyBuffereReader类: 自己写一个MyBuffereReader类,功能与BuffereReader相同

[java] view plain copy

  1. class MyBufferedReader1 extends Reader{
  2.  private Reader r;  
    
  3.  MyBufferedReader1(Reader r){  
    
  4.      this.r  = r;  
    
  5.  }  
    
  6.  //一次读一行数据的方法  
    
  7.  public String myReaderline()  throws IOException {  
    
  8.      //定义一个临时容器,原BufferReader封装的是字符数组。  
    
  9.     //为了演示方便。定义一个StringBuilder容器。最终要将数据变成字符串  
    
  10.     StringBuilder sb = new StringBuilder();  
    
  11.     int ch = 0;  
    
  12.     while((ch = r.read()) != -1)  
    
  13.     {  
    
  14.         if(ch == '\r')   
    
  15.             continue;  
    
  16.         if(ch == '\n')                    //遇到换行符\n,返回字符串  
    
  17.             return sb.toString();  
    
  18.         else  
    
  19.         sb.append((char)ch);  
    
  20.     }  
    
  21.     if(sb.length()!=0)                    //当最后一行不是以\n结束时候,这里需要判断  
    
  22.         return sb.toString();  
    
  23.     return null;  
    
  24. }  
    
  25. /* 
    
  26. 需要覆盖Reader中的抽象方法close(),read(); 
    
  27. */  
    
  28. public void close()throws IOException {  
    
  29.     r.close();  
    
  30. }  
    
  31. public int read(char[] cbuf,int off, int len)throws IOException {   //覆盖read方法  
    
  32.     return r.read(cbuf,off,len);  
    
  33. }  
    
  34. public void myClose() throws IOException{  
    
  35.     r.close();  
    
  36. }  
    
  37. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值