黑马程序员_IO流BufferWriter、BufferReader

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------- 


字符流的缓冲区

对应的类:BufferWriter、BufferReader

缓冲区要结合流才可以使用,并且在流的基础上对流的功能进行了增强

 

BufferedWriter:是给字符输出流提高效率用的,那就意味着,缓冲区对象建立时,必须要先有流对象。明确要提高具体的流对象的效率。

 

import java.io.*;

class ab

{

   public static void main(String[] args) throws IOException

    {

       //创建一个字符写入流对象。

       FileWriter fw = new FileWriter("buf.txt");

 

       //为了提高字符写入流效率。加入了缓冲技术。

       //只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。

       BufferedWriter bufw = new BufferedWriter(fw); //让缓冲区和指定流相关联。

 

       for(int x=1; x<5; x++)

       {

           bufw.write("abcd"+x);

           bufw.newLine();//写入一个换行符,这个换行符可以依据平台的不同写入不同的换行符

           bufw.flush();//对缓冲区进行刷新,可以让数据到目的地中

 

       }

 

       //关闭缓冲区,就是在关闭缓冲区中的流对象。

       bufw.close();

 

 

    }

}

BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。当返回null时,表示读到文件末尾。readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

readLine方法原理:无论是读一行,获取多个字符。其实最终都是在硬盘上一个一个读取,所以最终还是使用read一次读一个的方法

 

 

例子:

import java.io.*;

 

class ab

{

   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.print(line);

       }

       bufr.close();

    }

 

}

 

练习:

通过缓冲区复制一个.java文件。

 

import java.io.*;

 

class ab

{

   public static void main(String[] args)

    {

       BufferedReader bufr = null;

       BufferedWriter bufw = null;

 

       try

       {

           bufr = newBufferedReader(newFileReader("BufferedWriterDemo.java"));

           bufw = new BufferedWriter(newFileWriter("bufWriter_Copy.txt"));

 

           String line = null;

 

            while((line=bufr.readLine())!=null)

           {

                bufw.write(line);

                bufw.newLine();

                bufw.flush();

 

           }

       }

       catch (IOException e)

       {

           throw new RuntimeException("读写失败");

       }

       finally

       {

           try

           {

                if(bufr!=null)

                    bufr.close();

           }

           catch (IOException e)

           {

                throw new RuntimeException("读取关闭失败");

           }

           try

           {

                if(bufw!=null)

                    bufw.close();

           }

           catch (IOException e)

           {

                throw newRuntimeException("写入关闭失败");

           }

       }

    }

}

 

IO中的使用到了一个设计模式:装饰设计模式。

装饰设计模式解决:对一组类进行功能的增强。

包装:对已有的对象进行功能增强

装饰类通常会通过构造方法接收被装饰的对象。

并基于被装饰的对象的功能,提供更强的功能。;

 * 1、包装类和被包装对象要实现同样的接口;

 * 2、包装类要持有一个被包装对象;

 * 3、包装类在实现接口时,大部分方法是靠调用被包装对象来实现的,对于需要修改的方法我们自己实现;

下面结合一个代码来理解:

class Person

{

   public void chifan()

    {

       System.out.println("吃饭");

    }

}

class SuperPerson

{

   private Person p ;

   SuperPerson(Person p)

    {

       this.p = p;

    }

   public void superChifan()

    {

       System.out.println("开胃酒");

       p.chifan();

       System.out.println("甜点");

       System.out.println("来一根");

    }

}

class PersonDemo

{

   public static void main(String[] args)

    {

       Person p = new Person();

       SuperPerson sp = new SuperPerson(p);

       sp.superChifan();

    }

}

 

装饰与继承的区别:

继承扩展性比装饰差,装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的对象是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常是都属于一个体系中的。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值