项目 github 地址

一. 实现情况

基本要求

  • 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 实现的更多相关文章

  1. 个人项目-WC (java实现)

    一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...

  2. 个人项目 wc(java实现)

    一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...

  3. wc.java

    GitHub代码链接 1.项目相关要求 •基本功能列表: -c  统计文件中字符的个数 -w 统计文件中的词数 -l   统计文件中的行数 •拓展功能: -a  统计文件中代码行数.注释行数.空行 2 ...

  4. 个人项目:Java实现WC

    Java实现WC Github项目地址:https://github.com/auxshaw/WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...

  5. (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 ...

  6. 本地idea开发mapreduce程序提交到远程hadoop集群执行

    https://www.codetd.com/article/664330 https://blog.csdn.net/dream_an/article/details/84342770 通过idea ...

  7. HUST软测1504班第2周作业成绩:WordCount

    说明 本次公布的成绩为第2周个人作业WordCount的结果: 第2周个人作业:WordCount 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第2周作业第在线答疑区发帖申诉. 或直接在博客 ...

  8. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  9. 小白のjava实现wc.exe功能

    GitHub地址 项目完成情况 基本功能列表(已实现) wc.exe -c file.c     //返回文件 file.c 的字符数 wc.exe -w file.c    //返回文件 file. ...

随机推荐

  1. 如何禁止浏览器自动填充非登陆input的账号和密码?

    发现浏览器填充密码的方式,那就是,找到页面上第一个type为password的input填充.发现了这个规律后,很自然的就想到了,是不是可以在真正的password前面加一个隐藏的password,形 ...

  2. 配置Tomcat 7 Gzip

    <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" ...

  3. poj3616(LIS简单变式)

    题目链接:http://poj.org/problem?id=3616 思路: 我的第一反应是背包,因为每个interval要么选择要么不选,后来发现状态方程很难写出来.后来想一想发现就是LIS的简单 ...

  4. 给出一个十六进制的数0xFF 0x80 (只有2“位”) 将其转换成有符号的一字节的十进制整数

    #include <stdio.h>#include<iostream>#include <stdlib.h>#include<string.h>usi ...

  5. ios8 UITableView section不显示

    ios8 如果UITableView只设置viewForHeaderInSection,则可能section不能显示,iOS7及以下版本显示正常. 解决方案: 设置heightForHeaderInS ...

  6. swift iOS开发初步使用

    使用Xcode6-Beta 创建一个swift空的工程,新建一个UIViewController,语言选择swift. 在MainViewController.swift 添加如下代码,声明变量及cl ...

  7. day2:vcp考试

    Q21. An administrator has been instructed to secure existing virtual machines in vCenter Server.Whic ...

  8. dede后台一片空白

    原因是你修改了后台的数据库连接信息文件data/common.inc.php,保存的后文件编码并不是utf-8,而是变成了ANSI或utf-8 + bom的. 解决方法: 用editplus或note ...

  9. centos6.6中修改yum源

    1.进入设置yum源的目录 > cd /etc/yum.repos.d 2.复制或重命名CentOS-Base.repo文件 > mv CentOS-Base.repo CentOS-Ba ...

  10. UI设计行业中的“延禧攻略”,教你从青铜变王者

    最近一直在追<延禧攻略>,女主魏璎珞敢爱敢恨,有仇必报的性格吸引不少人,她从低贱的秀坊小宫女步步为营,最终成为皇帝最宠爱的令妃呼风唤雨.尔虞我诈的后宫,想要打怪升级光有颜值是万万不够的,更 ...