You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:06:01