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

如何统计TXT文档中指定单词出现次数?使用BufferedReader遇阻

解决TXT文档单词出现次数统计的问题

我来帮你搞定这个单词统计的问题!你用BufferedReader的思路是对的,但可能卡在了完整读取逻辑、单词拆分或标点/大小写处理上,下面先给你完善现有思路的代码,再分享更简便的Java 8+流处理方案。

一、完善你的BufferedReader实现

你的代码没写完,我先补全并优化,解决读取、单词匹配的核心问题(还处理了大小写统一、去除标点的细节,避免漏统计或误统计):

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class TekstiAnalüsaator {
    public static void main(String[] args) {
        // 要统计的目标单词
        String targetWord = "test";
        // 用HashMap存单词和出现次数
        Map<String, Integer> wordCount = new HashMap<>();
        
        // 用try-with-resources自动关闭流,避免资源泄漏
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream("test.txt"), StandardCharsets.UTF_8))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                // 拆分每行的单词:按非字母数字拆分,同时转小写统一匹配
                String[] words = line.toLowerCase().split("[^a-zA-Z0-9]+");
                for (String word : words) {
                    // 跳过空字符串(比如行首/行尾的拆分结果)
                    if (word.isEmpty()) continue;
                    // 更新统计次数
                    wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
                }
            }
            
            // 输出目标单词的次数
            System.out.println("单词'" + targetWord + "'出现次数:" + wordCount.getOrDefault(targetWord.toLowerCase(), 0));
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键优化点:

  • 用try-with-resources自动管理流资源,不用手动关闭BufferedReader和输入流
  • 统一转小写,避免大小写差异导致的统计遗漏(比如Test和test算同一个)
  • 用[^a-zA-Z0-9]+正则拆分单词,去除标点符号的干扰(比如test.会被处理成test)
  • 用getOrDefault简化次数更新逻辑,不用判断key是否存在

二、更简便的Java 8+流处理方案

如果你的项目用Java 8或更高版本,用Files.lines()配合流操作可以让代码更简洁,一行搞定统计逻辑:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.stream.Collectors;

public class TekstiAnalüsaator {
    public static void main(String[] args) {
        String targetWord = "test";
        String filePath = "test.txt";
        
        try {
            // 一行代码完成读取、拆分、统计
            Map<String, Long> wordCount = Files.lines(Paths.get(filePath))
                    .map(String::toLowerCase)
                    .flatMap(line -> java.util.Arrays.stream(line.split("[^a-zA-Z0-9]+")))
                    .filter(word -> !word.isEmpty())
                    .collect(Collectors.groupingBy(word -> word, Collectors.counting()));
            
            System.out.println("单词'" + targetWord + "'出现次数:" + wordCount.getOrDefault(targetWord.toLowerCase(), 0L));
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

为什么更简便?

  • 不用手动写循环读取每行,流API帮你处理迭代逻辑
  • 链式调用更直观,从读取到统计的流程一目了然
  • 同样处理了大小写和标点问题,统计结果准确

如果只需要统计单个单词,还可以进一步简化,不用生成完整的单词统计Map:

long count = Files.lines(Paths.get(filePath))
        .map(String::toLowerCase)
        .flatMap(line -> java.util.Arrays.stream(line.split("[^a-zA-Z0-9]+")))
        .filter(word -> word.equals(targetWord.toLowerCase()))
        .count();
System.out.println("单词'" + targetWord + "'出现次数:" + count);

这样代码更精简,直接过滤目标单词并计数,不用存储所有单词的统计结果。

内容的提问来源于stack exchange,提问作者Vlad Paskevits

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:02:27