黑马程序员_IO流输入输出-缓冲区

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

 

IO  BufferedWriter

字符流的缓冲区:

提高了对数据的读写效率

 

对应类:

BufferedWriter

BufferedReader

 

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

在流的基础上对流的功能进行了增强

 

缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要有流对象。

 

FileWriter fw=new FileWriter(“buf.txt”)

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

(其实就是封装了数组)

 

BufferedWriter bufw = new BufferedWriter(fw);

 

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

 

bufw.write("abcde");

//记住:只要用到缓冲区,就要刷新

bufw.flush();

bufw.close();

其实关闭缓冲区,就是在关闭缓冲区中的流对象,所以不用fw.close();

 

bufw.newLine();

//winlin都是换行

 

for()

{

...

bufw.flush();

//写一次刷一次,要不停电就费了

}

 

IO BufferedReader

 

FileReader fr=new FileReader("buf.txt");

BufferedReader bufr=new BufferedReader(fr);

String s1=bufr.readLine();

bufr.close();

 

 

String line=null;

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

{

       System.out.println(line);

}

一次读一行,方便对文本数据的获取,返回null时到文件末尾

 

 

 

BufferedReader bufr=null;

BufferedWriter bufw=null;

try

{

       bufr=new BufferedReader(new FileReader("BufferedWriterDemo.java"));

       bufw=new BufferedWriter(new FileWriter("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 new RuntimeException("写入关闭失败");}

}

 

readLine();返回时不包括行终止符

 

IO readLine原理,先存起来,遇到回车符,再全返回来,比read方法要高效很多。无论是读一行,获取读取多个字符。其实最终都是在硬盘上一个一个读取。所以最终使用的还是read方法,一次读一个的方法。

 

自己做一个readLine方法:

MyBufferedReader

自定义读取一行

 

/*

字符读取流缓冲区:

该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。

当返回null时,表示读到文件末尾。

 

readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

 

 

 

*/

 

import java.io.*;

/*

明白了BufferedReader类中特有方法readLine的原理后,

可以自定义一个类中包含一个功能和readLine一致的方法。

来模拟一下BufferedReader

*/

import java.io.*;

class MyBufferedReader extends Reader

{

      

       private Reader r;

       MyBufferedReader(Reader r)

       {

              this.r = r;

       }

 

       //可以一次读一行数据的方法。

       public String myReadLine()throws IOException

       {

              //定义一个临时容器。原BufferReader封装的是字符数组。

              //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。

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

              return null;            

       }

 

       /*

       覆盖Reader类中的抽象方法。

 

       */

       public int read(char[] cbuf, int off, int len) throws IOException

       {

              return r.read(cbuf,off,len) ;

       }

 

       public void close()throws IOException

       {

              r.close();

       }

       public void myClose()throws IOException

       {

              r.close();

       }

}

 

 

class  MyBufferedReaderDemo

{

       public static 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();

       }

}

 

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值