使用BufferedReader读取txt文件时如何识别文件结束避免重复读取
解决BufferedReader读取文件重复循环问题
BufferedReader的read()方法原生提供了循环终止判断值:当读取到文件流末尾时,方法会返回int类型的-1,你遇到的重复读取问题,几乎都是循环条件没有正确判断该返回值,或是外层嵌套了多余的循环逻辑导致的。
常见重复读取诱因
- 循环条件使用了
while(true)这类永真判断,读取完文件后没有主动跳出循环 - 读取逻辑外层套了其他循环,每次执行完一轮完整读取后,又重新实例化
BufferedReader打开同一文件触发重复读取 - 代码中误调用了
reset()方法,将流指针重置到文件开头位置
逐词打印的正确实现示例
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadWordFromTxt { public static void main(String[] args) { // 替换为你的目标txt文件路径 String txtPath = "your_file_path.txt"; // 用于拼接当前读取到的单词 StringBuilder currentWord = new StringBuilder(); // try-with-resources语法会自动关闭流,无需手动调用close try (BufferedReader br = new BufferedReader(new FileReader(txtPath))) { int charAscii; // 核心终止逻辑:read返回-1即代表文件读完,直接退出循环 while ((charAscii = br.read()) != -1) { char c = (char) charAscii; // 空格、制表符、换行、回车均视为单词分隔符 if (Character.isWhitespace(c)) { if (currentWord.length() > 0) { // 打印已拼接完成的单词 System.out.println(currentWord); currentWord.setLength(0); } } else { currentWord.append(c); } } // 处理文件末尾没有分隔符的最后一个单词 if (currentWord.length() > 0) { System.out.println(currentWord); } } catch (IOException e) { e.printStackTrace(); } } }
注意事项
- 必须将
read()的返回值先存入变量再做判断,禁止在循环条件和循环体中多次调用read(),否则会出现字符跳读的问题 - 优先使用try-with-resources语法管理流,读取完成后会自动关闭流,避免流被误操作触发重复读取
- 如果修改完循环条件后还是重复读取,直接排查读取逻辑外层是否有多余的循环结构
内容的提问来源于stack exchange,提问作者FoxVocs
相关产品推荐
相关产品推荐

