IO流学习笔记(二)之BufferedWriter与BufferedReader及实例Demo

在之前的学习笔记(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter与FileReader的Demo使用的中转数据buf实际就是缓冲区,是由我们自己创建的。

缓冲区可以提高效率,Java对缓冲区进行了封装,封装成了对象,即读与写操作都进行了缓冲:
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了增强

为什么会提高效率(同数据库连接池,避免每次的创建连接和断开连接,直接创建一个容器,使用完放回即可):
常规的读一次写一次的方式,磁头需要进行不断的切换
缓冲的方式,每次读取一块便在内存中存储一块,一旦装满了或者没有数据可以继续读取了,就开始写操作

代码:设计优化(重构);性能优化(最常见的手段之一就是缓冲区)

BufferdeWriter

public class BufferdeWriter extends Writer:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入

常用方法

本质:用数组在缓冲存流中的数据,因此缓冲区在被创建时,必须要有被缓存的对象
BufferedWriter(Writer out):创建一个使用默认大小输出缓冲区的缓冲字符输出流
BufferedWriter(Writer out,int sz):创建一个使用给定大小输出缓冲区的缓冲字符输出流
close():关闭此流,但要先刷新它
flush():刷新该流的缓冲
newLine():写入一个分隔符,实际就是将System.getProperty(“line.separator”)进行了封装
write(char[] cbuf,int off,int len):写入字符数组的某一部分
write(char c):写入单个字符
write(String s,int off,int len):写入字符串的某一部分

Demo

public class BufferedWriterDemo {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("buf.txt");
        //为提高写入的效率,使用字符流的缓冲区,创建一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
        BufferedWriter bufw = new BufferedWriter(fw);
        //使用缓冲区的写入方法将数据先写入缓冲区中
        bufw.write("abcdef");
        bufw.newLine();
        bufw.write("hahah");
        //使用缓冲区的刷新方法将数据刷到目的地中
        bufw.flush();
        //关闭缓冲区,缓冲区没有调用系统底层资源,真正调用底层资源的是FileWriter对象,缓冲区仅仅是一个提高效率的作用
        //因此,此处的close()方法关闭的是被缓存的流对象
        bufw.close();
    }
}

BufferedReader

public BufferedReader extends Reader:
从字符输入流读取文本,缓冲各个字符,从而实现字符、数组和行(文本的行数通过回车符来进行判定)的高效读取

常用方法

注意:缓冲区对象(例如BufferedWriter)操作的都是缓冲区中的内容,内容从外设到内存是由底层流对象完成的(例如Writer),具体将在如下介绍

read():读取单个字符
read(char[] cbuf,int off,int len):将字符读入数组的某一部分
readLine():读取一个文本行,通过下列字符之一即可认为某行已终止,换行(‘\n’),回车(‘\r’)或回车后直接跟着换行
返回:包含该行内容的字符串,不包含任何终止符,如果已经到达流末尾,则返回null

Demo

public class BufferedReaderDemo {
    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.println(line);
        }
    }
}

readLine()原理—缓冲原理

IO流学习笔记(二)之BufferedWriter与BufferedReader及实例Demo_第1张图片

bufr.read(buf)是建立缓冲区时调用的方法,因此虽然BufferedReader的read()方法是读取单个字符,但是也是从缓冲区读取,已经是高效方法了。

readLine()方法,在读到一个数据之后不进行操作,而是继续进行缓冲并判断结束标记,详细可以参加图示注释。

实现复制文本文件

public class Copy {
    //复制文本文件
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("buf.txt");
        BufferedReader bufr = new BufferedReader(fr);
        FileWriter fw = new FileWriter("buf_copy.txt");
        BufferedWriter bufw = new BufferedWriter(fw);
//        int ch = 0;
//        //下面的read()方法是从缓冲区中读
//        while ((ch=bufr.read())!=-1){
//            bufw.write(ch);//往缓冲区中写,是直接操作内存的,速度相对于快一些
//        }
//        bufw.close();
//        bufr.close();
        //按行读取,例如判断一行中是否有某些关键字,读取一行的方式比较方便,如果单纯复制操作,一个个读和按行读取皆可
        String line = null;
        while ((line=bufr.readLine())!=null){
            bufw.write(line);
        }
        bufw.close();
        bufr.close();//不使用close()方法,在每次bufw.write(line)操作后调用flush()方法也可以
    }
}

注:注释部分代码是逐个读取字符

你可能感兴趣的:(IO流)