Java.io.BufferedReader

在 Java 中,BufferedReader 是一个字符缓冲输入流类,主要用于高效地读取字符数据,属于 java.io 包下的核心类之一。它的设计目的是通过缓冲机制减少 IO 操作次数,从而提高读取文本文件或其他字符输入流的效率。

核心作用:

  1. 高效读取字符数据
    BufferedReader 内部维护了一个字符缓冲区(默认大小为 8192 字符),会一次性从底层输入流(如文件、网络流)读取一批数据到缓冲区,后续读取操作直接从缓冲区获取,避免了频繁调用底层 IO 方法(减少磁盘或网络访问次数),大幅提升读取性能。

  2. 提供便捷的读取方法
    相比基础的字符输入流(如 FileReader),BufferedReader 增加了更易用的方法,最常用的是:

    • readLine():一次读取一整行文本(以换行符 \n 或 \r\n 为结束标志),返回字符串(不包含换行符),到达流末尾时返回 null
    • read():读取单个字符,返回字符的 ASCII 码(int 类型),到达末尾返回 -1

常见使用场景:

  • 读取文本文件(如 .txt.csv 等)。
  • 读取控制台输入(通过包装 InputStreamReader 实现)。
  • 读取网络传输的字符数据(如 Socket 通信的输入流)。

使用示例:

1. 读取文本文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileExample {
    public static void main(String[] args) {
        // 声明BufferedReader变量
        BufferedReader br = null;
        try {
            // 创建BufferedReader对象,包装底层的FileReader(文件输入流)
            br = new BufferedReader(new FileReader("example.txt"));
            
            String line;
            // 循环读取每一行,直到readLine()返回null(文件结束)
            while ((line = br.readLine()) != null) {
                System.out.println(line); // 打印读取到的行
            }
        } catch (IOException e) {
            e.printStackTrace(); // 处理IO异常
        } finally {
            // 关闭流(必须在finally中确保关闭,释放资源)
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
2. 读取控制台输入
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadConsoleExample {
    public static void main(String[] args) {
        // 包装系统输入流(System.in),用于读取控制台输入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        try {
            System.out.print("请输入内容:");
            String input = br.readLine(); // 读取用户输入的一行文本
            System.out.println("你输入的是:" + input);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

注意事项:

  1. 必须关闭流BufferedReader 属于资源类,使用后必须调用 close() 方法关闭,否则会导致资源泄露。推荐使用 try-with-resources 语法(Java 7+)自动关闭流,简化代码:

    // try-with-resources:自动关闭实现了AutoCloseable接口的资源
    try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  2. 字符流特性BufferedReader 是字符流,主要处理文本数据(按字符编码读取),不适合读取二进制文件(如图片、视频等,应使用字节流 BufferedInputStream)。

  3. 编码问题:默认使用系统默认字符编码,如需指定编码(如 UTF-8),可通过 InputStreamReader 包装时设置:

    new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"))
    

总结:BufferedReader 是处理字符输入的高效工具类,通过缓冲机制和便捷方法(尤其是 readLine()),让文本读取变得简单高效,是 Java 中读取文本数据的首选类之一。

备注:

零、

System.in 是字节流,InputStreamReader 将其转为字符流

txt 文件是字节存储(任何文件都是字节存储)FileReader 将其转为字符流

一、FileReader 是什么?

FileReader 是 Java 中用于读取字符文件的输入流类(属于 java.io 包),它继承自 InputStreamReader,专门用于从文件中读取字符数据(按字符编码解析字节)。

它的核心作用是:

  • 连接文件系统,将文件中的字节数据按照默认字符编码(或指定编码)转换为字符。
  • 作为 “底层流” 提供基础的字符读取能力,但读取效率较低(因为每次读取可能直接操作磁盘)。

通常不会单独使用 FileReader,而是配合 BufferedReader 这样的缓冲流使用,以提高效率(就像之前示例中 new BufferedReader(new FileReader("file.txt")) 的用法)。

System.in 是字节流,InputStreamReader 将其转为字符流

txt 文件是字节存储,FileReader 将其转为字符流

二、如果送入 BufferedReader 的字符大小超过其缓冲区最大值会怎样?

首先明确:BufferedReader 的缓冲区是 **“临时存储区域”**,用于减少对底层流(如 FileReader)的访问次数,它的缓冲区大小(默认 8192 字符)并不限制 “能读取的字符总量”。

当读取的数据量超过缓冲区大小时,流程是这样的:

  1. BufferedReader 会先填满缓冲区(读取 8192 字符),供程序读取;
  2. 当程序读取完缓冲区的内容后,BufferedReader 会自动从底层流(FileReader)读取下一批数据,再次填满缓冲区;
  3. 重复上述过程,直到所有数据读取完毕。

简单说:缓冲区大小只是 “一次读取的批量大小”,不限制总读取量,无论文件有多大(只要内存足够),BufferedReader 都会分批次读取,不会因为总数据量超过缓冲区大小而报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值