黑马程序员——IO流(BufferedWriter和BufferedReader)

本文深入探讨了流操作中的缓冲区技术,包括字符写入流缓冲区和字符读取流缓冲区的工作原理及应用实例,同时展示了如何通过装饰设计模式自定义缓冲区类以实现更高效的数据读写。
------- android培训java培训、期待与您交流! ----------

缓冲区的出现是为了提高流的操作效率而出现的
所以在创建缓冲区之前,必须要有流对象
  /*
 字符写入流缓冲区
该缓冲区中提供了一个跨平台的换行符newLine();
 */

实例:
public static void main(String[] args){
FileWriter fw = null;
BufferedReader bufw = null;
try{
//创建一个字符写入流对象
fw =  new FileWriter("buf.txt");
//为了提高字符写入流效率,加入了缓冲技术。只要将需要被提高效率的流对象做为参数传递给缓冲区的构造函数即可。
bufw = new BufferedWriter(fw);
bufw.write("asd");
//只要用到缓冲区,就要刷新
bufw.flush();
}catch(IOException e){
System.out.println(e.toString());
}finally{
if(bufw != null){
//其实关闭缓冲区,就是关闭缓冲区的流对象
try{
bufw.close();
}catch(IOException e){
System.out.println(e.toString());
}
}
}
}
  /*
 字符读取流缓冲区
该缓冲区提供了一个一次读一行的方法,便于对文本的获取,返回null时表示读到文件末尾
 */

实例:
public static void main(String[] args){
//创建一个读取流对象和文件关联
FileReader fr = null;
//为了提高字符读取 流效率,加入了缓冲技术。只要将需要被提高效率的流对象做为参数传递给缓冲区的构造函数即可。
BufferedReader bufr = null;
try{
fr = new FileReader("buf.txt");
bufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine()) != null){
System.out.println(str);
}
}catch(IOException e){
System.out.println(e.toString());
}finally{
try{
bufr.close();
}catch(IOException e){
System.out.println(e.toString());
}
}

}

readLine方法原理:
      无论是读一行还是读取多个字符,最终都是在硬盘上一个一个读取,所以最终实用的还是read方法一次读一个的方法。
     通过BufferedReader类中的特有方法readLine可以自定义一个类中包含一个功能和readLine一致的方法
      class myBufferedReader{
             private FileReader r;
             myBufferedReader(FileReader r){
                      this.r = r;
             }
             //可以一次读一行的方法
             public  String myreadLine() throws IOException{
                    //定义一个临时容器,原BufferedReader封装的是字符数组
                    //为了
                   StringBuilder sb = new StringBuilder();
                    int ch = 0;
                    while((ch=r.read()) != -1){
                               if(ch == '"\r"){
                                      continue;
                                }
                               if(ch == "\n"){
                                      return sb.toString();
                                }else{
                                      sb.append((char)ch);
                                }
                    }
                    if(sb.length() != 0){
                          return sb.toString
                     }else{
                          return null;
                     }
             }
             public void myClose() throws IOException{
                  r.close();
              }
       }
      class myBufferedReaderDemo{
             public void main(String[] args) throws IOException{
                   FileReader fr = new FileReader("buf.txt");
                   myBufferedReader mybuf = new myBufferedReader(fr);
                  String line  = null;
                  while((line=mybuf.myReadLine()) !=  null){
                              System.out.println(line);
                   }
                   mybuf.myclose();
              }
       }
 
myBufferedReader 属于装饰设计模式--------当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的类称为装饰类。
装饰类通常通过构造函数接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
 
疑问:
为什么不直接采用继承呢?不更简单么?

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值