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

本文详细介绍了字符缓冲区技术的基本概念及其在Java编程中的应用。包括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=0;i<5;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();
            }
        }


    }
}

实现效果

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();
        }
        }
    }
}

这里写图片描述

练习

要求:使用缓存的方法复制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换行符,再将数组中的内容传给字符串。然后根据代码再读下一行。

图例如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值