跳转至

Java BufferedReader 全面解析

简介

在 Java 编程中,BufferedReader 是一个非常实用的字符输入流缓冲类,它可以显著提高从字符输入流中读取文本的效率。通过缓冲机制,BufferedReader 减少了与底层数据源(如文件、网络连接等)的交互次数,从而加快了数据读取的速度。本文将详细介绍 BufferedReader 的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用这一重要的 Java 类。

目录

  1. 基础概念
  2. 使用方法
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

1. 基础概念

BufferedReader 类位于 java.io 包中,它继承自 Reader 类。BufferedReader 的主要作用是从字符输入流中读取文本,将字符数据缓冲到内存中,以减少与底层数据源的交互次数。这样可以提高读取效率,尤其是在处理大量数据时。

BufferedReader 内部维护了一个缓冲区,当调用 read()readLine() 方法时,它首先从缓冲区中读取数据,如果缓冲区为空,则从底层输入流中读取一批数据填充到缓冲区。

2. 使用方法

2.1 创建 BufferedReader 对象

要使用 BufferedReader,首先需要创建一个 BufferedReader 对象。通常,我们会将其与另一个字符输入流(如 FileReaderInputStreamReader)结合使用。以下是创建 BufferedReader 对象的示例代码:

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

public class BufferedReaderExample {
    public static void main(String[] args) {
        try {
            // 创建 FileReader 对象
            FileReader fileReader = new FileReader("example.txt");
            // 创建 BufferedReader 对象,并将 FileReader 作为参数传入
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            // 使用完后关闭资源
            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.2 读取数据

BufferedReader 提供了两个常用的读取方法:read()readLine()

2.2.1 read() 方法

read() 方法用于读取单个字符,返回值为读取的字符的 ASCII 码值,如果到达流的末尾,则返回 -1。示例代码如下:

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

public class ReadSingleCharExample {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("example.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            int character;
            while ((character = bufferedReader.read()) != -1) {
                System.out.print((char) character);
            }

            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.2.2 readLine() 方法

readLine() 方法用于读取一行文本,返回值为读取的字符串,如果到达流的末尾,则返回 null。示例代码如下:

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

public class ReadLineExample {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("example.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }

            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 常见实践

3.1 从控制台读取用户输入

BufferedReader 也可以用于从控制台读取用户输入。可以将 System.in 包装成 InputStreamReader,再将其传递给 BufferedReader。示例代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadFromConsole {
    public static void main(String[] args) {
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(System.in);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            System.out.println("请输入一行文本:");
            String input = bufferedReader.readLine();
            System.out.println("你输入的文本是:" + input);

            bufferedReader.close();
            inputStreamReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2 统计文件行数

可以使用 BufferedReaderreadLine() 方法统计文件的行数。示例代码如下:

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

public class CountLinesInFile {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("example.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            int lineCount = 0;
            while (bufferedReader.readLine() != null) {
                lineCount++;
            }

            System.out.println("文件的行数是:" + lineCount);

            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 最佳实践

4.1 使用 try-with-resources 语句

在 Java 7 及以上版本中,推荐使用 try-with-resources 语句来自动关闭 BufferedReader 和其他实现了 AutoCloseable 接口的资源。这样可以避免手动关闭资源时可能出现的错误。示例代码如下:

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

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt");
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2 调整缓冲区大小

BufferedReader 的构造函数还提供了一个可选的参数,用于指定缓冲区的大小。如果需要处理大量数据,可以适当增大缓冲区的大小,以提高读取效率。示例代码如下:

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

public class CustomBufferSizeExample {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt");
             BufferedReader bufferedReader = new BufferedReader(fileReader, 8192)) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 小结

BufferedReader 是 Java 中一个非常实用的字符输入流缓冲类,它通过缓冲机制提高了数据读取的效率。本文介绍了 BufferedReader 的基础概念、使用方法、常见实践以及最佳实践。在实际开发中,我们可以根据具体需求选择合适的读取方法,并遵循最佳实践来提高代码的健壮性和性能。

6. 参考资料

  • 《Effective Java》(第三版)