Java IO流系列(三)—— 字符流的缓冲区

前言:上文我们介绍了字符流的基本用法,这篇文章将为大家简单讲解字符流的读取流BufferedReader、写入流BufferedWriter。笔者也将在最后引入装饰设计模式的概念。
原文出处:http://blog.csdn.net/u014158743/article/details/52675871

字符流的缓冲区:
- 只是为了提高读或写的效率
- 不具备读或写的功能
- 不能单独使用
- 需要结合着读流或写流使用

字符流的缓冲读取流:BufferedReader

提供了一个一次读取一行的功能 readLine()

public static void main(String[] args)throws IOException {
    //因为缓冲读取流不具备读取的功能,所以创建文件读取流对象和文件相关联
    FileReader fr = new FileReader("temp.txt");

    //为了提高读取的效率,把需要提高效率文件读取流对象作为参数传递给缓冲读流的构造方法
    BufferedReader br = new BufferedReader(fr);

    String line = null;
    while((line = br.readLine())!=null)//返回的一行不包含换行符
    {
        System.out.println(line);
    }

    br.close();
}

字符流的缓冲写入流: BufferedWriter

提供了一个跨平台的写入换行的功能 newLine()

public static void main(String[] args)throws IOException {
    //使用字符缓冲写入流实现文本文件的写入
    //因为缓冲写入流不具备写入的功能,所以先创建文件写入流和文件相关联
    FileWriter fw = new FileWriter("temp.txt");

    //为了提高写入的效率,使用字符流的缓冲区
    //把需要提高效率的文件写入流对象作为参数传递给缓冲流的构造方法
    BufferedWriter bw = new BufferedWriter(fw);

    //使用BufferedWriter提供的写入功能写入
    for(int i=1;i<=3;i++)
    {
       bw.write("abc"+i);
       bw.newLine();
       bw.flush();
    }

    bw.close();//关闭缓冲流就是关闭写入流

}

使用缓冲区复制一个文件

入门语:来一个try……catch的写法, 我怕有人不会。

/*
FileReader:  int read()
             int read(char[] arr)

FileWriter:  write(String ss) //没有写入到目的地

BufferedReader: readLine()

BufferedWriter: newLine()

使用缓冲区复制一个文件
*/
public static void main(String[] args) 
{
    BufferedReader br = null;
    BufferedWriter bw = null;
    try
    {
        br = new BufferedReader(new FileReader("temp.txt"));
        bw = new BufferedWriter(new FileWriter("temp_copy.txt"));

        String line = null;
        while((line = br.readLine())!=null)
        {
            bw.write(line);
            bw.newLine();//必须写入换行
            bw.flush();
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if(br!=null)
            try
            {
                br.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        if(bw!=null)
            try
            {
                bw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
    }
}

装饰设计模式

这里非常适合引入我们的一个设计模式叫做装饰设计模式,我们结合IO流一起来简单了解一下

/*
装饰设计模式:基于已经存在的功能提供增强的功能

装饰设计模式的由来:

Reader
  ----TextReader
  ----MediaReader
为了提高子类的读的效率,为每个子类定义缓冲读的功能的子类

Reader
  ----TextReader
      ----BufferedTextReader
  ----MediaReader
      ----BufferedMediaReader
  ----OtherReader
      ----BufferedOtherReader

Reader的子类越多,那么高效读的方式的子类也越多,那么
这个体系会越来越庞大,
既然都是为了提高读的效率,那么就把这个缓冲读的功能提取出来
封装到一个类中,谁需要被提高效率,就把谁作为参数传递

class BufferedReader
{
    private Reader r;
    public BufferedReader(Reader r)
    {
        this.r = r;
    }
}
以上体系就成了:
Reader
   ----TextReader

   ----MediaReader

   ----OtherReader

   ----BufferedReader

装饰设计模式的特点:
1:简化了继承体系,是原有体系变简单了
2: 装饰类在原有功能上提供的增强功能,所以还属于原有体系 
*/

字符流缓冲区就简单介绍这里, 笔者旨在以简单明了的例子唤起读者脑海里对知识的记忆。学而时习之,不亦乐乎。如果读者喜欢这篇文章,也不妨做个标记,今后留用。侥幸有用,便如笔者的愿。下篇文章将介绍字节流, 欢迎关注。

晚安

本系列开启篇:
http://blog.csdn.net/u014158743/article/details/52664986

猜你喜欢

转载自blog.csdn.net/u014158743/article/details/52675871