如何统计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
相关产品推荐
相关产品推荐

