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

读取文件时陷入无限循环求助:代码读完4行后无法退出循环

问题分析与修复方案

嘿,我一眼就揪出你代码里的问题啦——你同时初始化了Scanner和BufferedReader两个流来读取同一个文件,这俩流各自维护着自己的文件读取指针,互相干扰,导致reader.hasNext()的判断彻底乱套,没办法正确识别文件已经读完,所以循环就卡死退不出来了。而且你还初始化了FileReader却根本没用到,这也是多余的代码哦。

给你两个简单的修复方案,选一个用就行:

方案一:只用Scanner来读(简化版)

public void readPhoneBook() throws Exception {
    // 用try-with-resources自动关流,不用手动写close啦
    try (Scanner reader = new Scanner(new File(file))) {
        // 改用hasNextLine()判断是否还有下一行,比hasNext()更准确
        while (reader.hasNextLine()) {
            String line = reader.nextLine();
            String[] parts = line.split(" ");
            if (parts.length == 4) {
                PhoneBook newPhone = new PhoneBook(parts[0], parts[1], parts[2], parts[3]);
                // 这里加你的业务逻辑,比如把newPhone存进集合之类的
            }
        }
    }
}

小提醒:hasNext()是判断是否有下一个“令牌”(默认按空格切分),不是下一行,用hasNextLine()才是准确判断有没有未读的整行,避免判断出错。

方案二:只用BufferedReader来读(更高效)

如果你习惯用BufferedReader,也可以这么写:

public void readPhoneBook() throws Exception {
    try (BufferedReader input = new BufferedReader(new FileReader(file))) {
        String line;
        // readLine()读到文件末尾会返回null,用这个当循环终止条件
        while ((line = input.readLine()) != null) {
            String[] parts = line.split(" ");
            if (parts.length == 4) {
                PhoneBook newPhone = new PhoneBook(parts[0], parts[1], parts[2], parts[3]);
                // 处理你的业务逻辑
            }
        }
    }
}

最后再给你几个小建议:

  • 绝对不要同时用多个流读同一个文件,会把读取位置搞乱,各种奇怪问题都会找上门。
  • 尽量用try-with-resources语法(Java7及以上支持),它会自动关流,不用你手动写close(),避免资源泄漏。
  • 用split(" ")的时候要注意,如果行里有多个连续空格,会切出空字符串的元素,比如"Bob 5678"会切成["Bob", "", "5678"],要是想处理这种情况,可以换成split("\\s+"),它能匹配一个或多个空白字符。

内容的提问来源于stack exchange,提问作者ffe Lou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:44