文本统计小工具是Java入门阶段非常实用的练手项目,核心功能围绕字符串处理和文件读取展开,能够实现统计文本文件的字符总数、单词数量、行数、空行数等常见需求,帮助开发者巩固Java基础语法的实际应用能力。

需求梳理与核心逻辑
在编写工具前,首先需要明确功能边界,常见的文本统计需求包含以下几个部分:
- 统计文本的总字符数,包含空格和换行符
- 统计文本的总单词数,默认以空格、标点符号作为单词分隔符
- 统计文本的总行数
- 统计文本中的空行数量
- 支持从本地文本文件读取内容,也支持直接输入字符串统计
核心实现步骤
1. 文件读取功能实现
首先需要实现读取本地文本文件内容的能力,这里使用Java的字符流来读取文件,避免中文乱码问题,代码如下:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TextReader {
// 读取文件内容,按行返回
public static List<String> readFileByLine(String filePath) throws IOException {
List<String> lines = new ArrayList<>();
// 使用BufferedReader提升读取效率
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
lines.add(line);
}
}
return lines;
}
}
2. 统计功能实现
基于读取到的文本内容,分别实现不同的统计逻辑,核心统计类代码如下:
import java.util.List;
public class TextStatistics {
private List<String> lines;
// 构造方法,传入读取到的行内容
public TextStatistics(List<String> lines) {
this.lines = lines;
}
// 统计总字符数,包含每行的换行符
public int countTotalChars() {
int total = 0;
for (String line : lines) {
total += line.length();
// 每行后面默认有一个换行符,除了最后一行
total += 1;
}
// 最后一行没有换行符,减去多算的一个
if (total > 0) {
total -= 1;
}
return total;
}
// 统计总行数
public int countTotalLines() {
return lines.size();
}
// 统计空行数,空行指长度为0的行
public int countEmptyLines() {
int empty = 0;
for (String line : lines) {
if (line.trim().length() == 0) {
empty++;
}
}
return empty;
}
// 统计单词数量,以空格、逗号、句号、感叹号、问号作为分隔符
public int countTotalWords() {
int wordCount = 0;
for (String line : lines) {
// 先去除首尾空格,再按正则分割单词
String trimmedLine = line.trim();
if (trimmedLine.length() == 0) {
continue;
}
// 正则匹配分隔符:空格、逗号、句号、感叹号、问号、分号、冒号
String[] words = trimmedLine.split("[\s,.;!?:]+");
wordCount += words.length;
}
return wordCount;
}
}
3. 主程序入口实现
最后编写主程序,整合文件读取和统计功能,支持用户选择统计模式:
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
public class TextStatTool {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请选择统计模式:1. 统计本地文件 2. 统计输入的字符串");
int mode = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
if (mode == 1) {
System.out.println("请输入文件路径:");
String filePath = scanner.nextLine();
try {
List<String> lines = TextReader.readFileByLine(filePath);
TextStatistics statistics = new TextStatistics(lines);
printStatResult(statistics);
} catch (IOException e) {
System.out.println("文件读取失败,请检查路径是否正确:" + e.getMessage());
}
} else if (mode == 2) {
System.out.println("请输入要统计的字符串:");
String input = scanner.nextLine();
List<String> lines = new ArrayList<>();
// 按换行符分割输入的内容为行
String[] inputLines = input.split("n");
for (String line : inputLines) {
lines.add(line);
}
TextStatistics statistics = new TextStatistics(lines);
printStatResult(statistics);
} else {
System.out.println("输入的模式不正确");
}
scanner.close();
}
// 打印统计结果
private static void printStatResult(TextStatistics statistics) {
System.out.println("===== 统计结果 =====");
System.out.println("总字符数:" + statistics.countTotalChars());
System.out.println("总行数:" + statistics.countTotalLines());
System.out.println("空行数:" + statistics.countEmptyLines());
System.out.println("总单词数:" + statistics.countTotalWords());
}
}
注意事项与优化方向
上述代码实现了基础的文本统计功能,实际使用中还可以做以下优化:
- 文件读取时可以指定字符编码,避免不同编码格式的文件出现乱码,比如使用
InputStreamReader指定UTF-8编码 - 单词分割的正则可以根据实际需求调整,比如支持连字符的单词、中文分词等场景
- 可以增加更多统计维度,比如统计每个字符的出现频率、每个单词的出现次数等
- 可以封装成命令行工具,支持通过参数传入文件路径,不需要交互式输入
通过这个小工具的编写,可以熟练掌握String类的常用方法、split正则分割、IO流的基础使用以及集合的操作,是巩固Java基础非常好的实践方式。