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

来源:互联网 发布:淘宝网 雪嫦娥多肉植物 编辑:程序博客网 时间:2024/06/05 18:46

在之前的学习笔记(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()原理—缓冲原理

这里写图片描述

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()方法也可以    }}

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

阅读全文
1 0