BufferedReader 是 Java 中用于高效读取字符流的一个类,它位于 java.io 包中。它主要的作用是通过缓冲区来提高读取字符的效率,尤其是在读取大量数据时。使用 BufferedReader 可以减少 I/O 操作次数,提高程序的性能,特别是在读取文本文件时。

1. BufferedReader 的基本作用

BufferedReader 的核心功能是通过内部缓冲区存储一部分数据,从而减少对底层设备的 I/O 操作次数。这样,可以有效地提高读取数据的效率,因为每次读取数据时,不必每次都访问磁盘或其他慢速的输入设备。

基本流程:

  1. 缓冲区读取BufferedReader 会先将输入流中的一部分数据加载到内存中的缓冲区中。
  2. 按需读取:当读取数据时,会先从缓冲区读取,而不是每次都访问底层设备。
  3. 减少 I/O 操作:这大大减少了 I/O 操作的次数,提高了性能。

2. 构造方法

BufferedReader 有几个常用的构造方法:

  • BufferedReader(Reader in):将一个字符流包装成带缓冲区的 BufferedReader,它会读取底层流(如 FileReader)中的数据并存入缓冲区。
  • BufferedReader(Reader in, int sz):指定缓冲区的大小,sz 是缓冲区的大小,默认为 8KB。

3. 常用方法

  • read():读取单个字符,返回读取到的字符(以 Unicode 编码表示),如果已经到达流的末尾,则返回 -1int character = bufferedReader.read();
  • read(char[] cbuf):一次读取一组字符,返回读取的字符数。如果已经到达流的末尾,则返回 -1char[] buffer = new char[1024]; int length = bufferedReader.read(buffer);
  • readLine():读取一行文本(不包括行结束符)。当读到流的末尾时,返回 nullString line = bufferedReader.readLine();
  • close():关闭流,释放系统资源。调用 BufferedReaderclose() 方法时,它会同时关闭底层的输入流。 bufferedReader.close();

4. 使用示例

示例 1:读取文件内容

假设你有一个文本文件 example.txt,你想使用 BufferedReader 来读取它的内容:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        BufferedReader bufferedReader = null;

        try {
            // 创建一个 BufferedReader,传入 FileReader
            bufferedReader = new BufferedReader(new FileReader("example.txt"));

            String line;
            // 按行读取文件内容
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close(); // 关闭流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

示例 2:读取文件内容(使用 try-with-resources 语句)

Java 7 引入了 try-with-resources 语句,自动关闭实现了 AutoCloseable 接口的资源(如 BufferedReader)。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        // 使用 try-with-resources 自动关闭资源
        try (BufferedReader bufferedReader = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 为什么要使用 BufferedReader

BufferedReader 与直接使用 FileReader 相比,有显著的性能优势:

  • 提高性能:直接读取文件(每次读取一个字符)会导致大量的磁盘 I/O 操作,性能较差。而 BufferedReader 会先从文件中读取一块数据到内存中(缓冲区),然后按需读取,提高了效率。
  • 按行读取BufferedReader 提供了 readLine() 方法,可以很方便地按行读取文件,处理文本文件时非常常见。
  • 节省资源:减少了对底层设备的访问,减轻了 I/O 操作的负担。

6. 总结

  • BufferedReader 是一个高效读取字符流的工具,常用于读取文本文件。
  • 它通过缓冲区减少了多次 I/O 操作,提高了读取性能。
  • 常用方法包括:read(), readLine(), read(char[] cbuf), 和 close() 等。
  • 在读取文件时,推荐使用 BufferedReader 代替直接使用 FileReader,尤其是在处理大文件或频繁 I/O 时。

如果你需要进一步了解 BufferedReader 或其他 I/O 类的使用,欢迎继续提问!