WC Java 实现
一. 实现情况
基本要求
- c 统计文件字符数 (实现)
- w 统计文件词数 (实现)
- l 统计文件行数(实现)
扩展功能
- s 递归处理目录下符合条件得文件(实现)
- a 返回文件代码行 / 空行 / 注释行(实现)
高级功能
- x 图形化界面(未实现)
二. 解题思路
首先需要解析命令,取得命令变量与文件地址变量;根据命令的类型,分别对文件进行相对应的处理
基础的几个命令都是通过正则表达式或者简单的方法调用即可计算出结果
而 s 命令与其他命令不同,需要同时解析两个命令,并处理文件目录,获取符合需求的文件进行处理,与此同时还需要通过正则表达式来处理通配符。
三. 设计实现过程

代码中主要包含两个类,主体类和函数接口类
主题类包括 mian 方法,以及主要的业务逻辑代码;函数接口类用于实现模版方法模式,使得每个命令可以直接根据需要实现逻辑代码,增强了代码拓展性与减少了代码量
四. 代码说明
循环获取输入的命令,判断命令格式是否正确,是则进入命令解析方法
while (scan.hasNextLine()) {
String[] commandArray = scan.nextLine().trim().split("\\s+");
if ("wc.exe".equals(commandArray[0])) {
processFile(commandArray);
} else {
System.out.println("错误命令!");
}
}
判断是否为 s 命令,是则进入 s 命令处理方法,反之根据当前命令处理数据
static void processFile(String[] command) {
if ("-s".equals(command[1])) {
processDirectory(command);
return;
}
if (command.length > 3) {
System.out.println("错误命令!");
return;
}
if ("-c".equals(command[1])) {
calculate(command[2], (BufferedReader reader) ->
System.out.println("字符数:" + reader.lines()
.map(s -> s.replaceAll(" ", ""))
.mapToInt(String::length)
.sum())
);
} else if ("-w".equals(command[1])) {
...
} else if ("-l".equals(command[1])) {
...
} else if ("-a".equals(command[1])) {
...
} else {
System.out.println("错误命令!");
}
}
处理 s 命令时,通过 processDirectory 方法处理数据,进行通配符匹配与收集符合要求的文件地址
private static void processDirectory(String[] command) {
if (command.length < 4) {
System.out.println("错误命令!");
return;
}
String address = command[3];
//获得通配符文件名
String fileName = address.substring(address.lastIndexOf("\\") + 1);
//获得目录
File file = new File(address.substring(0, address.lastIndexOf("\\")));
//匹配通配符
Pattern p = Pattern.compile(fileName.replace(".", "\\.")
.replace("*", ".*")
.replace("?", ".?"));
//寻找当前目录以及子目录的所有文件
List<String> filePaths = getAllFilePaths(file, new ArrayList<>());
//过滤出目标文件
filePaths = filePaths.stream()
.filter(f -> p.matcher(f.substring(f.lastIndexOf("\\") + 1)).matches())
.collect(toList());
if (!filePaths.isEmpty()) {
for (String filePath : filePaths) {
System.out.println(filePath);
processFile(new String[]{"", command[2], filePath});
}
} else {
System.out.println("符合条件的文件不存在!");
}
}
calculate 以 ProcessFile 函数接口作为参数,上层代码可以直接传入逻辑代码作为参数
private static void calculate(String fileAddress, ProcessFile processFile) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileAddress));
processFile.process(reader);
} catch (FileNotFoundException e) {
System.out.println("找不到指定的文件!");
}
}
@FunctionalInterface
interface ProcessFile {
void process(BufferedReader reader);
}
五. 测试运行
测试文件:

测试结果:

六. P2P 表格

七. 项目小结
本次项目中利用了软件工程的思想,对项目中的每一步认真考虑,考量并预计了时间,整个项目实践下来收获很多,刚开始的时候对于需求的考量不够充分,造成了代码的不断修改,希望下一次能吸取教训
WC Java 实现的更多相关文章
- 个人项目-WC (java实现)
一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- 个人项目 wc(java实现)
一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...
- wc.java
GitHub代码链接 1.项目相关要求 •基本功能列表: -c 统计文件中字符的个数 -w 统计文件中的词数 -l 统计文件中的行数 •拓展功能: -a 统计文件中代码行数.注释行数.空行 2 ...
- 个人项目:Java实现WC
Java实现WC Github项目地址:https://github.com/auxshaw/WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...
- (https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014550004)Topic: Caught java.io.CharConversionException. ERRORCODE=-4220, SQLSTATE=null
270002WDPN 3 Posts 0 people l ...
- 本地idea开发mapreduce程序提交到远程hadoop集群执行
https://www.codetd.com/article/664330 https://blog.csdn.net/dream_an/article/details/84342770 通过idea ...
- HUST软测1504班第2周作业成绩:WordCount
说明 本次公布的成绩为第2周个人作业WordCount的结果: 第2周个人作业:WordCount 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第2周作业第在线答疑区发帖申诉. 或直接在博客 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 小白のjava实现wc.exe功能
GitHub地址 项目完成情况 基本功能列表(已实现) wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe -w file.c //返回文件 file. ...
随机推荐
- python文件的只读,只写操作
只读:r rb(bytes类型数据) 只写:w wb(bytes类型数据) 在文件最后追加: f = open('log',mode='a',encoding='utf-8') f.write('这里 ...
- maven配置国内镜像库
https://www.cnblogs.com/xiongxx/p/6057558.html
- Containerpilot 配置文件模板
{ "consul": "{{ .CONSUL }}:8500", "logging": { "level": &quo ...
- Retrofit2.0+RxJava2.0问题
问题1:java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path ...
- Maven(一)——Maven入门
一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...
- jsoncpp在Windows和Linux下的安装
Windows下: 参考这个网站,没什么问题,注意MTd这些选对就行了. http://www.cppblog.com/wanghaiguang/archive/2013/12/26/205020.h ...
- 全屏API
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2679 二.相关文章以 ...
- 如何在c语言中源文件调用另一个源文件的函数
在源文件A1.c中调用A2.c 中的函数有两种方法: 1.在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:在A2.c中:有函数void A2(){...};在 ...
- 调用数据库-corina
pym = mysql(host='#####', port=3306, user='######', password='########', database='algorithm') #查询数据 ...
- 创建 maven web 项目时 ,更改 为 Dynamic web module 为 3.0 时 项目报错
更改 项目 project facets 将 dynamic web module 改为 3.0 ,如果 java 的 版本 为 1.7 以下 ,项目会出现 叉 , 原因是 web 3.0 要和 ...