在Java的文件读取操作中,按行解析文本是处理配置文件、日志文件等场景的常用需求。FileReader负责将文件字节流转换为字符流,BufferedReader则提供了按行读取的缓冲能力,两者配合可以高效完成文本按行解析的任务。
两个类的核心作用
FileReader是字符输入流,继承自InputStreamReader,它的作用是打开指定路径的文件,将文件的字节数据按照默认字符编码转换为字符流,方便后续对字符内容的处理。但它本身没有提供按行读取的方法,只能逐个字符或者按字符数组读取,效率较低。
BufferedReader是缓冲字符输入流,它接收一个Reader类型的对象作为参数,内部维护了一个字符缓冲区,可以减少直接读取文件的操作次数。它提供了readLine()方法,能够直接读取一行文本,返回的内容不包含行终止符,非常适合按行解析的场景。
完整实现步骤
1. 准备测试文件
首先在项目的根目录或者指定路径下创建一个测试文本文件,比如命名为test.txt,内容如下:
第一行测试内容 第二行测试内容 第三行测试内容
2. 编写核心解析代码
实现按行解析的核心逻辑是先将FileReader实例传入BufferedReader的构造方法,然后循环调用readLine()方法直到返回null,代表文件读取完毕。完整代码如下:
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class TextLineParser {
public static void main(String[] args) {
// 定义文件路径,这里使用相对路径,也可以替换为绝对路径如D:/test.txt
String filePath = "test.txt";
// 声明BufferedReader和FileReader变量,方便在finally块中关闭资源
BufferedReader bufferedReader = null;
FileReader fileReader = null;
try {
// 创建FileReader实例,打开目标文件
fileReader = new FileReader(filePath);
// 将FileReader传入BufferedReader构造方法,创建缓冲读取流
bufferedReader = new BufferedReader(fileReader);
String lineContent;
// 循环调用readLine方法,当返回null时说明文件已经读取完毕
while ((lineContent = bufferedReader.readLine()) != null) {
// 处理每一行的内容,这里示例是打印输出
System.out.println("读取到的行内容:" + lineContent);
}
} catch (IOException e) {
// 捕获并处理IO异常,比如文件不存在、没有读取权限等情况
e.printStackTrace();
} finally {
// 关闭资源,遵循先开后关的原则,先关闭BufferedReader再关闭FileReader
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3. 代码运行结果
运行上述代码后,控制台会输出以下内容:
读取到的行内容:第一行测试内容 读取到的行内容:第二行测试内容 读取到的行内容:第三行测试内容
注意事项
- FileReader使用的是系统默认字符编码,如果文本文件的编码和默认编码不一致,会出现乱码问题,此时可以替换为InputStreamReader,手动指定编码格式,比如UTF-8。
readLine()方法返回的行内容不包含换行符和回车符,如果需要保留行终止符,需要额外处理。- 资源关闭操作必须放在finally块中,避免因为异常导致资源无法释放,也可以使用Java 7引入的try-with-resources语法简化关闭逻辑,代码如下:
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class TextLineParserV2 {
public static void main(String[] args) {
String filePath = "test.txt";
// try-with-resources会自动关闭实现AutoCloseable接口的资源
try (FileReader fileReader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String lineContent;
while ((lineContent = bufferedReader.readLine()) != null) {
System.out.println("读取到的行内容:" + lineContent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
适用场景
这种组合方式适合处理中小体积的文本文件,比如配置文件、普通日志文件等。如果是超大文件,建议结合流式处理的方式,避免一次性加载过多内容到内存中。如果需要处理非文本类型的文件,不建议使用这种字符流组合,应该使用字节流相关类实现。
FileReaderBufferedReader按行解析文本处理修改时间:2026-06-16 16:03:37