黑马程序员__关于学习IO流字符流的缓冲区总结

           ------- android培训java培训、期待与您交流! ----------

 

缓冲区的出现提高了对数据的读写效率   对应类 BufferedWriter ,BufferedReader,

缓冲区要结合流才能使用

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

BufferedWriter类将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入,可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

构造方法:BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流

                  BufferedWriter(Writer out, int sz)创建一个使用指定大小输出缓冲区的新缓冲字符输出流

                  在创建缓冲区对象时候要传入流对象,因为缓冲区就是为流服务的。

BufferedWriter类有一个写入单个字符方法write(int c) ,有写入字符串的某一部分的方法write(String s, int off, int len),有写入字符数组的某一部分的方法write(char[] cbuf, int off, int len)。写入缓冲区的之后要使用flush()方法,刷新流的缓冲,才能将内容分类写入文件。
如果要在一个写文件的程序中写入一个换行符,BufferedWriter类提供了一个跨平台功能的方法newLine()写入一个行分隔符,因为在不同的系统环境识别的换行符不一样,例如在windows平台下识别的是"\r\n",而在Linux环境下识别的是"\n",为了克服这个差异,Java提供了newLine()方法。

在程序结束的时候要关闭缓冲区,使用close()方法,但这个方法的实际功能也是在关闭流对象,所有就不用再写关闭FileWriter流对象的close()方法

BufferedReader类从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

构造方法:BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流,

                  BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。

                  同样在创建缓冲区对象的时候也要传入文件读取流对象。

同样有读取单个字符的方法read(),将字符读入数组的某一部分的方法read(char[] cbuf, int off, int len) ,其中参数cbuf - 目标缓冲区,off - 开始存储字符处的偏移量,len - 要读取的最大字符数 。高效率的读取方法是读取一行,readLine(),通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行,也是跨平台的。一个模拟内部功能的方法如下:

public String myReadLine() throws IOException{
    StringBuilder sb = new StringBuilder();
    int ch = 0;
    while((ch = r.read())!=-1){    //r是文件读取流对象
        if(ch=='\r')
            continue;
        if(ch=='\n')
            return sb.toString();
        else
            sb.append((char)ch);
    }
    if(sb.length()!=0)
        return sb.toString();
    return null;
}

其实readLine()方法还是使用了底层的read()方法,使用了设计模式中的装饰设计模式。

下面是一个复制文件的程序实例:

import java.io.*;
class CopyByBufTest{
    public static void main(String args[]){
        BufferedReader bufr = null;
        BufferedWriter bufw = null;
        try{
            bufr = new BufferedReader(new FileReader("CopyByBufTest.java"));
            bufw = new BufferedWriter(new FileWriter("CopyByBufTest_Copy.txt"));
            String line = null;
            while((line=bufr.readLine())!=null){
                bufw.write(line);
                bufw.flush();
            }
        }catch(IOException e){
            throw new RutimeException("读写失败");
        }finally{
            try{
                if(bufr!=null)
                    bufr.close();
            }catch(IOException e){
                throw new RutimeException("读取关闭失败");
            }finally{
                 try{
                     if(bufw!=null)
                         bufw.close();
                 }catch(IOException e){
                     throw new RutimeException("写入关闭失败");
                 }
            }
        }
    }
}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值