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. ...
随机推荐
- Electron Browser加载iframe(webview src属性)
browser或者webcontents 的高度与宽度比例对webview中src的页面结构也是有一定影响的
- IEdevelopToolbar ie浏览器的css代码调试工具
使用IEdevelopToolbar的“选择元素”工具(ctrl+b),选取你要内容的地方下方的DIV,我们就可以找到几个关键字
- sql server 数据库学习
http://m.blog.csdn.net/anxpp/article/details/51295020
- hdoj3038(带权并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:对于给定的a1..an,通过询问下标x..y,给出a[x]+...+a[y],但给出的值可 ...
- SQL Server多条件查询的实现
SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...
- python学习——urlparse模块
urlparse模块: 1.urlparse() 具体程序及结果如下: >>> url = 'http://i.cnblogs.com/EditPosts.aspx?opt=1'&g ...
- Web站点性能拨测脚本
功能:检测自己本地访问目标网站的返回状态.访问质量信息 [root@localhost src]# cat get_site_status.sh #! /usr/bin/env bash if [[ ...
- Spring集成Redis使用注解
转载:http://blog.csdn.net/u013725455/article/details/52129283 使用Maven项目,添加jar文件依赖: <project xmlns=& ...
- jxl 创建excel
public static void performanceExcel(String sCurrPath,List<Record> list, String begin,String en ...
- EXP-00056:遇到oracle错误12154
执行命令如下: 引用 exp user/pwd@dbname file=d:text.dmp owner=(user) 碰到了错误: 引用 EXP-00056:遇到oracle错误12154 ORA- ...