Java BufferedReader:如何读取文件(附示例)
⚡ 智能摘要
Java BufferedReader 通过缓冲字符的方式从输入流中读取文本,这使得逐行读取文件变得快速而简单。ping 内部的 FileReader BufferedReader 和 looping on readLine 直到返回 null 为止,打印整个文件。

如何读取文件 Java?
Java 它提供了多种从文件中读取数据的机制。其中最有用的软件包是 java.io他的腹肌tract Reader 该类定义了字符流读取。 java.io.BufferedReader 是用于高效逐行读取的具体子类。
什么是 BufferedReader 中 Java?
Buffer电子书阅读器 是一个意念波· Java 该类通过缓冲字符来读取输入流(例如文件)中的文本,从而高效地读取字符、数组和行。如果没有缓冲,则对 Reader 发出的每个读取请求都会触发对底层字符流或字节流的相应读取请求。
因此建议包装 BufferedReader 适用于任何 Reader,其 read() 手术可能成本高昂,例如: FileReader 和 InputStreamReader典型的用法是将文件路径传递给读取器,如下所示:
// Note the doubled backslash: a single \ starts an escape sequence objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));
这会将文件加载到 objReader然后,遍历文件内容并打印每一行。下面代码中的 while 循环会读取文件,直到到达文件末尾。
while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); }
strCurrentLine 保持当前线路,并且 objReader.readLine() 返回一个字符串。因此,只要返回值不为空,循环就会一直迭代,直到遇到第一个空值(表示文件结束)才会停止。
BufferedReader 示例
以下代码完整 Java BufferedReader示例:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { BufferedReader objReader = null; try { String strCurrentLine; objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt")); while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (objReader != null) objReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
注意: 此 finally 阻塞问题。它保证了 objReader.close() 无论是否抛出异常,此操作都会执行,它会释放底层文件句柄并保持 内存管理 可预测的。嵌套的 try 语句 finally 需要这样做,因为 close() 它本身宣称 IOException.
BufferedReader JDK7 示例
从 JDK 7 开始,try-with-resources 移除了 finally 完全阻塞。括号中声明的任何资源 try 即使发生异常,当代码块退出时,语句也会按照创建顺序的相反顺序自动关闭:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample_jdk7 { private static final String FILENAME = "D:\\DukesDiary.txt"; public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) { String strCurrentLine; while ((strCurrentLine = br.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } } }
这个版本更简洁、更安全,因此是编写新代码时首选的形式。读取文件只是该类的一种用途;下一节将把它与大多数初学者首先使用的替代方案进行比较。
BufferedReader 与 Scanner:该用哪个?
这两种方法都能读取文本,初学者通常会随意选择其中一种。它们解决的问题不同,如果选择错误,要么会导致手动解析笨拙,要么会在输入文本达到数千行时导致处理速度缓慢。下表对它们进行了对比。
| 方面 | Buffer电子书阅读器 | 扫描器 |
|---|---|---|
| Returns & Exchanges | 整行字符串 | 已解析的词法单元和基本元素 |
| 内置解析器 | 不——要么你自己分裂,要么你自己皈依。 | 是的——nextInt,nextDouble,下一行 |
| 默认缓冲区 | 8192字符 | 1024字符 |
| 处理大文件的速度 | 更快 | 速度较慢,因为使用了正则表达式分词。 |
| 螺纹安全 | Sync变质 | 未同步 |
| 最适合 | 逐行读取大文件 | 需要输入值的小型交互式输入 |
选择 Buffer当目标是快速浏览文件并自行处理文本时,可以使用 edReader;当需要直接读取文本值而无需编写转换代码时,可以使用 Scanner。使用以下方式分割返回的每一行: 字符串分割方法 给 BufferedReader 具备扫描仪的大部分便利功能,而且速度更快。
如何使用读取控制台输入 Buffer电子书阅读器
同一个类可以读取键盘输入,这对于小型命令行程序和编程挑战输入非常有用。 System.in 是一个字节流,因此不能传递给 Buffer直接使用 edReader。 InputStreamReader 将字节转换为字符,并且 BufferedReader 在此基础上增加了高效的行阅读功能。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadConsoleExample { public static void main(String[] args) throws IOException { // Bridge the System.in byte stream to a character stream try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.print("Enter your age: "); // readLine always returns text, so convert it explicitly int age = Integer.parseInt(reader.readLine().trim()); System.out.println("Hello " + name + ", age " + age); } } }
有三点细节值得记住。首先, readLine() 始终返回字符串,因此必须使用字符串转换输入数值。 Integer.parseInt 或者类似情况,并且输入非数字内容会抛出异常。 NumberFormatException — 如果输入不可信,则对转换进行包装。其次,调用 .trim() 删除末尾的回车符 Windows 控制台追加内容是解析失败的常见原因。第三,避免关闭被包装的读取器。 System.in 如果程序稍后仍需要控制台输入,因为关闭包装器会永久关闭该进程的底层流。
对于读取多个值的程序来说,读取一行并将其拆分比调用 `split()` 方法要快得多。 readLine() 反复调用,因为每次调用只有在缓冲区为空时才会进入操作系统。这正是竞技程序员偏爱使用这种方法的主要原因。 Buffer使用 edReader 而非 Scanner 进行批量输入。
即使代码正确,仍有一些错误反复出现。
相当常见 BufferedReader错误及其解决方法
桥梁 BufferedReader 的错误通常源于文件路径、资源处理或字符编码,而非读取循环本身。以下每个错误都列出了其异常情况及其解决方法。
- 非法转义字符: 路径使用单个反斜杠,例如:
"D:\DukesDiary.txt". Double 它"D:\\DukesDiary.txt"或者使用正斜杠, Java 接受 Windows. - 文件未找到异常: 路径是相对于工作目录的,而不是相对于源文件的。打印
new File(name).getAbsolutePath()看哪里 Java 正在查看。 - 首次读取时抛出空指针异常: 由于构造函数抛出异常,并且该异常被忽略,因此读取器从未被赋值。请检查…… 异常处理 在循环之前。
- 乱码或问号字符: 文件是UTF-8编码,但
FileReader应用了平台默认字符集。请显式传递字符集,例如:new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - 直播已关闭: 循环内部的读取器已关闭,或者在 try-with-resources 语句结束后被重新使用。每次遍历文件时,都应该打开一个新的读取器。
