项目 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. 吴裕雄 数据挖掘与分析案例实战(8)——Logistic回归分类模型

    import numpy as npimport pandas as pdimport matplotlib.pyplot as plt # 自定义绘制ks曲线的函数def plot_ks(y_tes ...

  2. java heap space解决方法和JVM参数设置

    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...

  3. django1.8模板位置的设置setting.py

    大多数django教程比较老,给出的template的设置方案为: 更改工程下的setting.py文件, TEMPLATE_DIRS = (     os.path.join( APP_DIR, ' ...

  4. ElementTree 解析xml(minidom解析xml大文件时,MemoryError)

    在使用minido解析xml文件时,因为文件过大,结果报错MemoryError.查询后得知是因为minidom在解析时是将所有文件放到内存里的,很占用内存,所以要考虑换一种方法来处理xml文件.   ...

  5. nyoj528-找球号(三) 【位运算】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=528 找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2   描述 ...

  6. SpringBoot中使用消息中间件Kafka实现Websocket的集群

    1.在实际项目中,由于数据量的增大及并发数的增多,我们不可能只用一台Websocket服务,这个时候就需要用到Webscoket的集群.但是Websocket集群会遇到一些问题.首先我们肯定会想到直接 ...

  7. 15-matlab矩阵运用

    from scipy.spatial import Delaunay from mpl_toolkits.mplot3d import Axes3D import numpy as np import ...

  8. 文件Move操作

    #coding=utf-8 import os import shutil stra = "G:/should/v3/a" strb = "G:/should/v3/b& ...

  9. session总结

    1.session是服务器端内存中的一块存储空间. 2.不同的浏览器窗口对应着不同的Session对象,两者的关系由Session ID来进行维护. 3.session的生命周期是以最后一次请求到达服 ...

  10. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...