如何在Java中统计目标单词在文本文件中出现的次数

发布时间 - 2026-01-04 00:00:00    点击率:

本文详解如何正确读取文本文件并精确统计用户指定单词在整个文件中的完整匹配次数,修正常见逻辑错误(如仅读首行、误用contains导致子串误判),提供健壮、可运行的java实现方案。

在Java中统计一个单词在文本文件中完整、独立出现的次数(而非作为子字符串被包含),需要同时解决三个关键问题:

  1. 逐行读取整个文件(而非只读第一行);
  2. 按单词边界切分(避免将 "long" 错误匹配到 "longer" 或 "belong" 中);
  3. 区分大小写与标点干扰(如 "Long," 应视为有效匹配)。

原代码中存在两个核心缺陷:

  • szSearch = br.readLine(); 仅读取了文件第一行,后续 while (szSearch.contains(szWord)) 实际是无限循环(因 szSearch 值未更新)或直接跳过;
  • contains() 判断的是子串包含关系,会导致 "long" 匹配 "longer"、"along" 等非目标词,造成统计失真。

✅ 正确做法是:使用 BufferedReader 循环读取每一行,对每行进行空格分割 + 精确单词比对,并推荐使用正则预处理以兼容标点(如英文逗号、句号)。以下是优化后的完整实现:

import java.io.*;
import java.util.Arrays;
import java.util.regex.Pattern;

public class WordCounter {
    public static void main(String[] args) {
        Scanner szKeyboard = new Scanner(System.in);
        BufferedReader br = null;
        try {
            System.out.print("What word are you searching for? ");
            String targetWord = szKeyboard.nextLine().trim();
            if (targetWord.isEmpty()) {
                System.out.println("Error: Search word cannot be empty.");
                return;
            }
            System.out.println("Searching the file...");

            br = new BufferedReader(new FileReader("WORDLIST.txt"));
            String line;
            int count = 0;
            // 使用正则预处理:替换非字母数字字符为空格,确保单词边界清晰
            Pattern nonWord = Pattern.compile("[^a-zA-Z0-9]+");

            while ((line = br.readLine()) != null) {
                // 按空白符分割,并过滤空字符串
                String[] words = nonWord.matcher(line).replaceAll(" ").split("\\s+");
                for (String word : words) {
                    if (!word.isEmpty() && word.equalsIgnoreCase(targetWord)) {
                        count++;
                    }
                }
            }

            System.out.println("The word \"" + targetWord + "\" appears " + count + " times in the file WORDLIST.txt.");

        } catch (FileNotFoundException e) {
            System.out.println("Error - File not found: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("Error - Reading file: " + e.getMessage());
        } finally {
            szKeyboard.close();
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println("Warning - Failed to close reader: " + e.getMessage());
                }
            }
            System.out.println("\n\n--- File End ---");
        }
    }
}

? 关键改进说明:

  • ✅ 使用 while ((line = br.readLine()) != null) 确保逐行遍历全文
  • ✅ Pattern.compile("[^a-zA-Z0-9]+").matcher(line).replaceAll(" ") 将所有标点、特殊符号统一转为空格,避免 "long," 被当作独立单词遗漏;
  • ✅ split("\\s+") 按任意空白符(空格、制表符、换行等)安全分割;
  • ✅ word.equalsIgnoreCase(targetWord) 支持不区分大小写的精确匹配(如搜索 "Long" 可匹配 "long");
  • ✅ 显式 trim() 和 !word.isEmpty() 过滤空项,防止空字符串干扰计数。

⚠️ 注意事项:

  • 若需严格区分大小写,将 equalsIgnoreCase 替换为 equals;
  • 若文件编码非默认平台编码(如含中文或UTF-8 BOM),建议显式指定:new InputStreamReader(new FileInputStream("WORDLIST.txt"), "UTF-8");
  • 对于超大文件,可考虑使用 Files.lines(Paths.get("WORDLIST.txt")) 配合 Stream API 提升可读性(Java 8+)。

此方案兼顾准确性、鲁棒性与可维护性,可直接集成到实际项目中。


# word  # java  # 编码  # app  # ai  # stream  # java实现  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  西安专业网站制作公司有哪些,陕西省建行官方网站?  JavaScript模板引擎Template.js使用详解  网站建设要注意的标准 促进网站用户好感度!  在centOS 7安装mysql 5.7的详细教程  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何在景安服务器上快速搭建个人网站?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  装修招标网站设计制作流程,装修招标流程?  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何使用Gate和Policy进行授权?(权限控制)  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  怎样使用JSON进行数据交换_它有什么限制  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何彻底删除建站之星生成的Banner?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  三星网站视频制作教程下载,三星w23网页如何全屏?  WordPress 子目录安装中正确处理脚本路径的完整指南  网站制作报价单模板图片,小松挖机官方网站报价?  利用python获取某年中每个月的第一天和最后一天  如何在万网ECS上快速搭建专属网站?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Linux网络带宽限制_tc配置实践解析【教程】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  深圳网站制作培训,深圳哪些招聘网站比较好?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Java垃圾回收器的方法和原理总结  javascript基本数据类型及类型检测常用方法小结  如何在阿里云部署织梦网站?  如何在香港服务器上快速搭建免备案网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何在香港免费服务器上快速搭建网站?  Android滚轮选择时间控件使用详解  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何在IIS服务器上快速部署高效网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  移动端脚本框架Hammer.js  浅述节点的创建及常见功能的实现