Java中将IO流包装为BufferedReader按行读取文本的核心是:先用FileInputStream或FileReader获取数据源,再经InputStreamReader转码(推荐显式指定字符集),最后套BufferedReader调用readLine();FileReader依赖系统默认编码易乱码,不推荐生产使用;Files.lines可简化UTF-8文件读取。

要将 Java 中的 IO 流包装成 BufferedReader 实现按行读取文本,核心是:先用原始字节流(如 FileInputStream)或字符流(如 FileReader)获取数据源,再通过 InputStreamReader 转换编码(若需指定字符集),最后套一层 BufferedReader,调用 readLine() 即可逐行读取。
使用 FileReader + BufferedReader(适合纯文本文件,系统默认编码)
如果文件是本地文本且编码与系统一致(如 UTF-8 或 GBK 环境下匹配),可直接用 FileReader 作为字符流源头:
try (FileReader fr = new FileReader("data.txt");
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
注意:FileReader 不支持显式指定字符集,依赖系统默认编码,容易乱码。生产环境不推荐单独使用。
使用 FileInputStream + InputStreamReader + BufferedReader(推荐,可指定编码)
这是最通用、最安全的方式,尤其适合需要明确控制字符集(如 UTF-8、GBK)的场景:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;
try (FileInputStream fis = new FileInputStream("data.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
-
必须指定字符集(如
StandardCharsets.UTF_8),避免因平台差异导致乱码 -
InputStreamReader是桥接类,把字节流转换为字符流 - 三层包装顺序不能颠倒:字节流 → 转码器 → 缓冲读取器
一行代码简化写法(Java 7+,配合 Files.lines)
如果只是简单读取文件所有行,无需复杂处理,可用 Files.lines(内部已封装好 UTF-8 的 BufferedReader):
try (Stream<String> lines = Files.lines(Paths.get("data.txt"), StandardCharsets.UTF_8)) {
lines.forEach(System.out::println);
}
该方式返回的是 Stream,适合函数式操作;但注意它不缓存全部内容,仍基于底层 BufferedReader 按需读取。
常见问题提醒
-
readLine() 返回 null 表示流结束,不是空行;空行会返回空字符串
"" - 务必使用
try-with-resources自动关闭,否则BufferedReader及其底层流可能未释放 - 不要对同一个流多次包装
BufferedReader,会导致跳行或异常 - 网络流(如
Socket.getInputStream())也可同样包装,只需确保远端发送的是文本且编码一致

















