天天看点

Java基础知识IO流(BufferedWriter&BufferedReader)

  • 缓冲区
  • 字符的缓冲区
  • BufferedWriter
  • BufferedReader
  • 练习
  • readLine()方法原理介绍

缓冲区:

什么是缓冲区?

就像人喝水时,不会从饮水机里一滴一滴地喝水,而是用一个杯子接满了之后再喝。这时杯子就相当于一个缓存区,提高了喝水的效率。

其实很多软件都有其缓冲技术,比如下载软件,在下载的过程中都有缓冲区,从服务器端拿到数据之后,先存放在内存当中,当内存中的数据达到一定量之后,再写到硬盘上去,否则如果从服务端拿到一个数据就到硬盘写一次,频繁的擦写操作,效率很低。

字符的缓冲区

对于字符流来说为了提高对数据的读写效率,引入了字符流体系中的缓冲区技术,并提供了对应的缓冲区对象。

对应类:

  • BufferedWriter 具有缓冲技术的写入字符流
  • BufferedReader具有缓冲技术的读取字符流

BufferedWriter:

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

构造方法:

BufferedWriter(Writer out)

创建一个使用默认大小输出缓冲区的缓冲字符输出流。

BufferedWriter(Writer out, int sz)

创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

注:BufferedWriter的缓冲原理就是将Writer对象和数组对象封装到对象里面,所以构造方法中都有Writer对象。

代码注释:

  1. 创建一个字符写入流对象
  2. 为了提高字符写入流效率,加入缓冲技术,只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
  3. 缓冲写入流中提供了一个跨平台的换行方法:newLine()

    Why? Because在不同系统平台上的换行符是不一样的,windows的换行符是\r\n,Linux的换行符是\n。为了实现跨平台,提供了newLine()方法,原理就是先判断是什么系统,然后调用write()方法,写入\r\n或者\n。

import java.io.*;

class day1901 
{
    public static void main(String[] args) 
    {
        FileWriter fw=null;
        BufferedWriter bfw=null;
        try
        {
            fw=new FileWriter("DemoTxt.txt");
            bfw=new BufferedWriter(fw);
            for(int i=;i<;i++)
            {
                bfw.write("abcd"+i);
                bfw.newLine();
                fw.flush();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if(bfw!=null)
                    bfw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }


    }
}
           
Java基础知识IO流(BufferedWriter&amp;BufferedReader)

BufferedReader:

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

构造方法:

BufferedReader(Reader in)

创建一个使用默认大小输入缓冲区的缓冲字符输入流。

BufferedReader(Reader in, int sz)

创建一个使用指定大小输入缓冲区的缓冲字符输入流。

BufferedReader提供了一个新的读取文本的方法:

读取一个文本行。通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行。

返回:

包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

抛出:

IOException - 如果发生 I/O 错误

例子:读取DemoTxt.txt文件中的字符,并输出在控制台上。

import java.io.*;

class day1902 
{
    public static void main(String[] args) 
    {
        FileReader fr=null;
        BufferedReader bur=null;
        try
        {
            fr=new FileReader("DemoTxt.txt");
            bur=new BufferedReader(fr);

            String line=null;
            while((line=bur.readLine())!=null)
            {
                System.out.println(line);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if(bur!=null)
                    bur.close();
            }
            catch (IOException e)
        {
            e.printStackTrace();
        }
        }
    }
}
           
Java基础知识IO流(BufferedWriter&amp;BufferedReader)

练习

要求:使用缓存的方法复制DemoTxt.txt文件的内容,写入DemoTxt2.txt内。

import java.io.*;

class CopyTextByBuf 
{
    public static void main(String[] args) 
    {
        BufferedReader bur=null;
        BufferedWriter buw=null;
        try
        {
            bur=new BufferedReader(new FileReader("DemoTxt.txt"));
            buw=new BufferedWriter(new FileWriter("DemoTxt2.txt"));

            String line=null;
            while((line=bur.readLine())!=null)
            {
                buw.write(line);
                buw.newLine();
                buw.flush();
            }
        }
        catch (IOException e)
        {
            throw new RuntimeException("复制失败");
        }
        finally
        {
            try
            {
                if(bur!=null)
                    bur.close();
            }
            catch (IOException e)
            {
                throw new RuntimeException("写入流关闭失败");
            }

            try
            {
                if(buw!=null)
                    buw.close();
            }
            catch (IOException e)
            {
                throw new RuntimeException("读取流关闭失败");
            }
        }
    }
}
           

readLine()原理

其实缓存区无论是读一行,还是获取多个字符,其实最终都是在硬盘上一个一个读取,最终使用的还是read()方法一次读一个的方法。

readLine()方法,读取一行的字符,原理也是调用read()方法,一个一个地读,只是在读硬盘文件的过程中,在内存中临时创建数组,将读取的字符存放到数组中,直到读取到\r\n换行符,再将数组中的内容传给字符串。然后根据代码再读下一行。

图例如下:

Java基础知识IO流(BufferedWriter&amp;BufferedReader)