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

Java文本文件多字符串搜索问题排查与循环位置优化

问题根源与修复方案

核心问题分析

  1. 文件读取指针耗尽:原代码在第一个单词的循环里就把整个文件读完了,BufferedReader的指针停在文件末尾,后续单词循环时br.readLine()直接返回null,根本不会再读取文件内容,导致后面的单词都被误判为未找到。
  2. 统计逻辑时机错误:每读一行就立刻判断并输出结果,而不是等整个文件读完统计完总次数后再输出,会导致多次重复输出同一个单词的状态。
  3. 未处理重复输入:用户输入重复单词时会重复搜索,不符合“重复输入的单词仅搜索一次”的要求。

正确循环结构与修改方案

步骤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 ə м

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:45:29