WhiteSpaceCounter Java代码统计空白字符结果异常,求问题排查
代码问题排查及修复方案
问题根因
- 直接原因:
countWords变量定义在while循环外层,会累计所有行的单词总数,你每次给whitespaceCount加的是全局累计单词数减1,相当于每处理一行就重复叠加之前所有行的空白计数,最终结果自然会异常偏高。
举个简单的验证场景:文件有2行,第一行是a b c(3个词,2个间隔空白),第二行是d e(2个词,1个间隔空白),你原来的代码执行后:- 处理第一行:
countWords = 3,whitespaceCount += 2→ 累计值为2 - 处理第二行:
countWords = 3+2=5,whitespaceCount += 4→ 累计值为6,正确结果应该是3,误差就是重复累加导致的。
- 处理第一行:
- 额外逻辑缺陷:你当前的实现只能统计单词之间的空白分隔次数,无法统计实际空白字符总数:
split("\\s+")会把连续多个空白当成1次分隔,同时忽略行首行尾的空白,且readLine()会丢弃每行末尾的换行符(换行符也属于空白字符),如果你的需求是统计所有空白字符的个数,这个逻辑本身就不成立。 - 资源泄漏风险:你打开的IO流没有主动关闭,长时间运行会占用系统资源。
修复方案
方案1:仅统计单词之间的空白分隔次数(适配你原来的需求逻辑)
import java.io.*; public class WhiteSpaceCounter { public static void main(String[] args) throws IOException { File file = new File("excerpt.txt"); // try-with-resources语法自动释放IO资源,无需手动关流 try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) { String sentence; int whitespaceCount = 0; while((sentence = reader.readLine()) != null) { String[] wordlist = sentence.trim().split("\\s+"); // 空行处理:trim后为空的行不统计 if (wordlist.length > 0 && !wordlist[0].isEmpty()) { whitespaceCount += wordlist.length - 1; } } System.out.println("单词间隔空白总数为:" + whitespaceCount); } } }
方案2:统计所有空白字符的实际个数(空格、制表符、换行、回车等所有空白都统计)
直接逐字符判断更准确,避免split带来的逻辑误差:
import java.io.*; public class WhiteSpaceCounter { public static void main(String[] args) throws IOException { File file = new File("excerpt.txt"); int whitespaceCount = 0; try (FileInputStream fis = new FileInputStream(file)) { int charCode; while ((charCode = fis.read()) != -1) { if (Character.isWhitespace(charCode)) { whitespaceCount++; } } System.out.println("文件内空白字符总数为:" + whitespaceCount); } } }
内容的提问来源于stack exchange,提问作者Willardino
相关产品推荐
相关产品推荐

