7.缓冲输入字符流BufferedReader与缓冲输出字符流BufferedWriter

本文详细介绍了Java中用于提高输入输出效率的缓冲字符流BufferedReader和BufferedWriter。BufferedReader用于缓冲输入,通过readLine()方法一次性读取一行数据,而BufferedWriter则用于缓冲输出,通过内部的缓冲区提高文件写入速度。文章还提供了使用案例以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 缓冲输入字符流 BufferedReader

- - - - | Reader 所有输入字符流的基类。 抽象类

- - - - - - - - | FileReader 读取文件字符串的输入字符流。

- - - - - - - - | BufferedReader 缓冲输入字符流。缓冲输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。  其实该类内部也是维护了一个字符数组

 

记住:缓冲流都不具备读写文件的能力。

 

1.2 BufferedReader 的使用案例

readLine():一次读取一行数据,不能读\r\n

package buffer;

import java.io.*;

public class Dome1 {
    // 程序入口main方法
    public static void main(String[] args) {
        File file = new File("E:\\aa\\bb\\Demo1.java");
        // 使用字节写的readLine()方法读取文件数据
        testMyReadLine(file);
        System.out.println();
        // 使用BufferedReader读取文件数据
        testBufferReader1(file);

    }

    //测试BufferedReader类
    public static void testBufferReader1(File file) {
        // 2.搭建通道
        FileReader fileReader = null;
        BufferedReader bufferedReader = null;
        try {
            fileReader = new FileReader(file);//搭建硬盘与内存之间传输数据的通道
            bufferedReader = new BufferedReader(fileReader);//缓冲类不具备读写能力

            // 3.读取数据
            String context = null;// 用来存储读取到的数据
            while ((context = bufferedReader.readLine()) != null) {// readLine每次读一行,但是不读\r和\n
                System.out.println(context);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    //测试自己写的readLine()方法
    public static void testMyReadLine(File file) {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(file);
            String s = null;//存储读取到的字符串
            while ((s = myReadLine(fileReader)) != null) {
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭资源
                fileReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    // 自己写一个readLine()方法
    public static String myReadLine(FileReader fileReader) {
        StringBuilder stringBuilder = new StringBuilder();//存储一行数据
        int len = 0;//存储每次读取的数据
        try {
            // 循环对读取的字节进行判断,如果是普通字节,则追加到stringBuilder中,如果是\r 则重新读取,如果是\n则结束读取,并返回之前读取的所有字节组成的字符串
            while (((len = fileReader.read()) != -1)) {
                if (len == '\r') {//如果读到的是\r,重新读取下一个字节
                    continue;
                } else if (len == '\n') {//如果读到的是\n,结束循环
                    break;
                } else {
                    stringBuilder.append((char) len);//如果读取到普通字节,放入字符串中
                }
            }
            if (len == -1) {
                return null;//如果读取结果是-1,表示没有读取到任何数据,返回null值
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } //资源交给调用者去关闭,否则会发生java.io.IOException: Stream closed
        return stringBuilder.toString();//返回读取到的\n之前的字符串(也就是一行字符串)
    }
}

 

2. 缓冲输出字符流BufferedWriter

- - - - | Writer所有输出字符流的基类,抽象类。

- - - - - - - - | FileWriter 向文件输出字符数据的输出字符流。

- - - - - - - - | BufferedWriter 缓冲输出字符流。缓冲输出字符流作用: 提高FileWriter的写数据效率与拓展FileWriter的功能。

BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。

BufferedWriter提供了一个可以指定数组长度的构造方法。

Writer内部维护了一个1024字节长度的数组作为缓冲区,FileWriter继承了Writer类,所以FileWriter相当于内部也维护了一个1024数组的缓冲区。

 

2.2BufferedWriter案例

public class Dome2 {
    public static void main(String[] args) {
        // 1.指定目标文件
        File file = new File("E:\\aa\\bb\\BufferedWriter.txt");
        // 2.搭建通道
        FileWriter fileWriter = null;
        BufferedWriter bufferedWriter = null;
        try {
            fileWriter = new FileWriter(file);
            bufferedWriter = new BufferedWriter(fileWriter);

            // 3.传输数据
            String content = "大家好!!";//向硬盘文件输出的数据
            bufferedWriter.write(content);// 向硬盘文件输出数据
            bufferedWriter.newLine();// newLine()的作用就是向文件输出一个 \r\n,即输出一个换行符。
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // 关闭资源
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

 

3. 使用缓冲字符模拟软件登录

package buffer;

import java.io.*;
import java.util.Scanner;

public class SimulationLogin {
    public static void main(String[] args) {
        File file = new File("E:\\aa\\bb\\user.txt");

        while (true) {
            System.out.println("欢迎使用模拟登录系统...");
            System.out.println("请选择:A 注册    B 登陆    C 退出");
            Scanner scanner = new Scanner(System.in);
            String option = scanner.next();
            if ("a".equalsIgnoreCase(option)) {
                // 注册
                reg();
            } else if ("b".equalsIgnoreCase(option)) {
                // 登录
                login();
            } else if ("c".equalsIgnoreCase(option)) {
                // 退出
                System.out.println("成功退出模拟登陆系统...");
                return;
            } else {
                System.out.println("输入有误,请重新输入...");
            }
        }
    }




    //注册功能
    public static void reg() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = scanner.next();// 用户名
        String password = null;//密码
        String user = null;//用户信息

        File file = new File("E:\\aa\\bb\\user.txt");//找到目标文件
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;

        try {
            // 搭建数据传输通道
            bufferedReader = new BufferedReader(new FileReader(file));//读取数据对象
            bufferedWriter = new BufferedWriter(new FileWriter(file, true));//输出数据对象
            boolean isEsixt = false;//判断用户名是否存在的标识

            String content = null;//用于存储读取的数据
            // 判断用户名是否已存在
            while ((content = bufferedReader.readLine()) != null) {//读取一行数据
                String[] s = content.split(" ");//根据空格将读取的数据进行切分
                if (username.equals(s[0])) {//判断读取的用户名与注册用户名是否相同
                    isEsixt = true;
                    break;
                }
            }
            if (isEsixt) {// 存在提示重新注册
                System.out.println("注册失败,用户名已存在,请重新输入新的用户名...");
                isEsixt = false;
            } else {// 不存在,提示用户注册成功,并将数据写入到硬盘文件中

                System.out.print("请输入密码:");
                password = scanner.next();// 密码
                user = username + " " + password;//用户名与密码

                bufferedWriter.write(user);//将数据写入硬盘文件
                bufferedWriter.newLine();//换行
                System.out.println("用户注册成功...");
                System.out.println("用户信息:[username = " + username + ", password = " + password + "]");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                // 释放资源
                bufferedWriter.close();
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }





    //登录功能
    public static void login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = scanner.next();// 用户名
        System.out.print("请输入密码:");
        String password = scanner.next();// 密码
        String userInfo = username + " " + password;// 用户信息

        File file = new File("E:\\aa\\bb\\user.txt");//找到目标文件
        BufferedReader bufferedReader = null;

        boolean isExist = false;//用于标记用户是否存在的标识,默认不存在

        try {
            // 搭建数据通道
            bufferedReader = new BufferedReader(new FileReader(file));
            String user = null;// 用户存储从文件中读取的数据
            // 读取文件数据,查询用户是否存在
            while ((user = bufferedReader.readLine()) != null) {
                if (userInfo.equals(user)) {
                    isExist = true;
                    break;
                }
            }

            //判断用户是否存在
            if (isExist) {
                String[] s = user.split(" ");
                System.out.println("欢迎用户 " + s[0] + " 成功登录模拟登录系统...");
            } else {
                System.out.println("用户名或密码不正确,请确认后重新输入...");
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                // 释放资源
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值