读取文件时陷入无限循环求助:代码读完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
相关产品推荐
相关产品推荐

