Java文本文件多字符串搜索问题排查与循环位置优化
问题根源与修复方案
核心问题分析
- 文件读取指针耗尽:原代码在第一个单词的循环里就把整个文件读完了,
BufferedReader的指针停在文件末尾,后续单词循环时br.readLine()直接返回null,根本不会再读取文件内容,导致后面的单词都被误判为未找到。 - 统计逻辑时机错误:每读一行就立刻判断并输出结果,而不是等整个文件读完统计完总次数后再输出,会导致多次重复输出同一个单词的状态。
- 未处理重复输入:用户输入重复单词时会重复搜索,不符合“重复输入的单词仅搜索一次”的要求。
正确循环结构与修改方案
步骤1:调整文件读取时机
每次搜索新单词时重新打开文件(或提前缓存整个文件内容),避免指针停在文件末尾无法读取的问题。
步骤2:调整统计与输出时机
对每个单词,先遍历完整个文件统计总出现次数,再根据次数输出结果,而不是读一行就输出一次。
步骤3:去重处理用户输入
用Set存储用户输入的单词,自动过滤重复项,满足“重复输入仅搜索一次”的需求。
修正后的代码
package search; import java.io.*; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Read { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); final String FILE_PATH = "java.txt"; System.out.println("Enter the number of words:"); int n = sc.nextInt(); sc.nextLine(); // 读取换行符,避免后续读取空内容 // 用Set自动去重,处理重复输入的单词 Set<String> wordSet = new HashSet<>(); System.out.println("Enter words:"); for (int i = 0; i < n; i++) { String word = sc.next(); wordSet.add(word); } // 遍历去重后的每个单词,逐个搜索 for (String targetWord : wordSet) { int count = 0; // 每次搜索新单词时重新打开文件,确保从开头读取 try (FileReader fr = new FileReader(FILE_PATH); BufferedReader br = new BufferedReader(fr)) { String line; // 遍历整个文件统计单词出现次数 while ((line = br.readLine()) != null) { String[] words = line.split(" "); for (String word : words) { if (word.equals(targetWord)) { count++; } } } } // try-with-resources自动关闭流,无需手动操作 // 统计完成后统一输出结果 if (count == 1) { System.out.println(targetWord + " 在文件中仅出现一次"); } else if (count > 1) { System.out.println(targetWord + " 在文件中出现超过一次"); } // 未出现的单词不输出,符合需求 } sc.close(); } }
关键修改说明
- 文件读取优化:每次搜索新单词时重新打开文件,用try-with-resources语法自动管理流,既避免指针耗尽问题,又防止资源泄漏。
- 去重处理:通过
HashSet自动过滤用户输入的重复单词,确保每个单词只搜索一次。 - 统计逻辑调整:先遍历完整文件统计总次数,再统一输出结果,避免中途重复输出无效状态。
内容的提问来源于stack exchange,提问作者ј e ə м
相关产品推荐
相关产品推荐

