Java 实现 WC.exe
Github:https://github.com/YJOED/Code/tree/master/WC/src
一、题目:实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。具体功能要求:
- 程序处理用户需求的模式为:wc.exe [parameter] [file_name]
- 基本功能列表:
- wc.exe -c file.c //返回文件 file.c 的字符数。(实现)
- wc.exe -w file.c //返回文件 file.c 的词的数目 。(实现)
- wc.exe -l file.c //返回文件 file.c 的行数。(实现)
- 扩展功能:
- -s 递归处理目录下符合条件的文件。(实现)
- -a 返回更复杂的数据(代码行 / 空行 / 注释行)。(实现)
- 高级功能:
- -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。(未实现)
二、设计思路
利用Java里的IO流对文件内容进行读取,通过创建Scanner类的实例从键盘获取操作命令和目的文件,使用了缓冲流的readline()方法对文件按行读取,使用String类的split()方法、matches()方法对每一行的的字符数、词数、行数进行统计,判断每一行是否是空行、注释行或代码行,使用了IO中的FileFilter()接口以及File类中的listFiles(FileFilter f)方法实现对指定路径下的符合条件的文件进行过滤操作。将基本功能"-l"、“-w”、“-c”、“-a”封装在一个方法里Operation()中,将拓展功能“-a”的实现封装在方法SpecialLine()中,将拓展功能“-s”的实现封装在HandleFile()中,根据输入的命令,调用不同的方法,方法与方法之间也有调用关系。
- 功能模块:
基本功能:Operation(String[] sip) {…}
统计特殊行:SpecialLine(BufferedReader br) {…}
处理多个文件:HandleFile(String[] file) {…}
文件过滤器:class MyFileFilter implements FileFilter{…}
- 流程图:
三、代码分析
- 主方法:获取命令和操作文件的路径、名称,根据输入的命令格式调用相应的方法进行操作:
import java.io.*;
import java.util.*;
import java.lang.String; public class WC {
public static void main(String[] args)throws Exception {
Scanner input = new Scanner(System.in);
while (true) {
System.out.println("please input '[order] [filename]':");
System.out.print("wc.exe ");
String ip[] = input.nextLine().split(" ");
if (ip.length==2) {
Operation(ip);
}else if(ip.length==3 && "-s".equals(ip[0])){
HandleFile(ip);
}else System.out.println("Error");
}
}
2.基本功能——统计字符数、词数、行数,命令与文件以字符串数组的形式作为参数传入该方法,判断输入的命令,执行相应的操作,如果命令为“-a”,调用另一方法统计特殊行:
public static void Operation(String[] sip)throws Exception{
String s;
int linecount = 0, wordcount = 0, charcount = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sip[1])));
if ("-l".equals(sip[0])) { // Line count
while ((s = br.readLine()) != null) {
linecount++;
}
System.out.println("Line count:" + linecount);
} else if ("-c".equals(sip[0])) { // Char count
while ((s = br.readLine()) != null) {
charcount = charcount + s.length();
}
System.out.println("Char count:" + charcount);
} else if ("-w".equals(sip[0])) { // Word count
while ((s = br.readLine()) != null) {
String[] sa = s.split("\\s+|\\(|\\)|,|\\.|\\:|\\{|\\}|\\-|\\+|;|\\?|\\/|\\\\|/");
wordcount = wordcount + sa.length;
}
System.out.println("Word count:" + wordcount);
} else if("-a".equals(sip[0])){
SpecialLine(br);
}
br.close();
}
3.统计特殊行:第一次实现时忽略了注释行还可以使用“/*……*/”表示,添加入对应的正则表达式并查找资料后使用了一个标记targer来统计这种情况下的注释行数;
public static void SpecialLine(BufferedReader br)throws Exception {
String s;
String REGEX_1 = "\\s*(\\{|\\})?//.*";
String REGEX_2 = "(\\{|\\})?\\s*";
String REGEX_3 = "\\s*/\\*.*";
String REGEX_4 = ".*\\*/";
boolean targer = false;
int blankline = 0, commentline = 0, codeline = 0;
while ((s = br.readLine()) != null) {
if (s.matches(REGEX_1)) {
commentline++;
}else if (s.matches(REGEX_2)) {
blankline++;
}else if(s.matches(REGEX_3)&&!s.matches(REGEX_4)){
commentline++;
targer = true;
}else if(targer==true){
commentline++;
if(s.matches(REGEX_4)){
targer=false;
}
}else codeline++;
}
System.out.println("Blank Line count:"+blankline);
System.out.println("Comment Line count:"+ commentline);
System.out.println("Code Line count:"+ codeline);
}
4.递归处理目录下符合条件的文件:在该命令中需要对文件进行过滤,只取出那些我们需要操作的文件即可,所以使用了FileFilter接口实现文件的过滤,使用substring()和lastIndexOf()来将模糊输入的文件类型和文件目录分割开。打印文件名并输出统计情况:
public static void HandleFile(String[] file)throws Exception{
String path=null,filetype=null;
String[] sip={file[1],null};
if(file.length>2){
filetype = file[2].substring(file[2].lastIndexOf("."));
path = file[2].substring(0,file[2].lastIndexOf("\\"));
}
File f = new File(path);
MyFileFilter mff = new MyFileFilter(filetype);
File[] files = f.listFiles(mff);
for(int i=0;i<files.length;i++){
sip[1]=files[i].getPath();
System.out.println("File Name: "+files[i].getName());
Operation(sip);
}
}
5.文件过滤器接口的实现,重写了该接口的accept()方法:在accept()方法中,对符合条件的文件返回TRUE,否则返回FALSE:
class MyFileFilter implements FileFilter{
String str;
public MyFileFilter(String _str){
str = _str;
}
public boolean accept(File pathname){
//if(pathname.isDirectory()) return true;
String f = pathname.getName();
if(f.endsWith(str)) return true;
return false;
}
}
四、测试结果
测试用文件:
测试结果:
1.命令“-s”、”-a“:
2.命令“-w”:
3.命令“-c”:
4.命令“-l”:
五、PSP2.1表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
20 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
60 |
Development |
开发 |
180 |
240 |
· Analysis |
· 需求分析 (包括学习新技术) |
20 |
20 |
· Design Spec |
· 生成设计文档 |
30 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
40 |
60 |
· Coding |
· 具体编码 |
180 |
240 |
· Code Review |
· 代码复审 |
25 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
60 |
Reporting |
报告 |
30 |
30 |
· Test Report |
· 测试报告 |
20 |
20 |
· Size Measurement |
· 计算工作量 |
20 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
25 |
合计 |
745 |
955 |
六、项目小结
通过这一次的程序练习,不仅对软件工程的思想有了更深的认识,在动手实现之前通过估计时间并与实际完成所需时间进行对比,还让我意识到自己其实对实现这样一个小程序还不够熟练,对编程的练习还是太少,需要加强练习,提高技巧,提升能力,以减短不必要的时间的消耗和浪费。
Java 实现 WC.exe的更多相关文章
- 小白のjava实现wc.exe功能
GitHub地址 项目完成情况 基本功能列表(已实现) wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe -w file.c //返回文件 file. ...
- java实现wc.exe
Github地址:https://github.com/ztz1998/wc/tree/master 项目相关要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功 ...
- 软工作业No.1。Java实现WC.exe
网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...
- JAVA实现WC.exe功能
项目要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能要求: 程序处理用户需求的模式为: wc.exe [paramet ...
- 软件工程:Java实现WC.exe基本功能
项目相关要求 GitHub地址:https://github.com/3216004716/WC 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处 ...
- 软工作业1—java实现wc.exe
github项目地址 https://github.com/liyizhu/wc.exe WC 项目要求 基本功能列表: wc.exe -c file.c //返回文件 file.c 的字符数 ...
- 软件工程实践一 —— java之wc.exe
SoftwareEngineering-wc github项目地址:https://github.com/CuiLam/SoftwareEngineering-wc 项目相关要求 实现一个统计程序 ...
- 软工作业1:wc.exe项目开发(java)
Github地址:https://github.com/Zzhaomin/learngit 项目相关要求 : wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...
- WC.exe(Java实现)
一.GitHub项目地址:https://github.com/nullcjm/mypage 二.项目相关要求: wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写 ...
随机推荐
- Cesium有价值网址
//比较粗 https://www.cnblogs.com/mazhenyu/p/6494748.html //很详细 2019.4.19 https://www.cnblogs.com/fuckgi ...
- mongodb(三)
索引详讲索引管理空间索引 for(var i = 0 ; i<200000 ;i++){ db.books.insert({number:i,name:i+"book"}) ...
- 「小程序JAVA实战」小程序我的个人信息-注销功能(42)
转自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/ 注 ...
- 多线程 同步对象 event 简单实例 &进程间通信
多线程 同步对象event import threading,time class Boss(threading.Thread): def run(self): print("BOSS:今晚 ...
- 谈谈跨平台的app开发 坚定的选择了flutter
目前市场上,(市场也许用的不对),比较常见的技术有xamrin.RN.Flutter,确切的说flutter是后起之秀,笔者也是最近才开始学习,xamrin是微软系的技术,笔者也很早就开始学习了,RN ...
- Centos7 配置
参考文章: http://www.hksilicon.com/kb/articles/594621/CentOS-7 1. 查看时区是否正确timedatectl,若不正确则设置时区 timedate ...
- iOS布局之Auto Layout
学习资源: <iOS6核心编程>自动布局部分 <iOS6范例经典>自动布局部分 Tutorial: iOS 6 Auto Layout versus Springs and S ...
- C#中的goto
int i = 9;if (i % 2 == 0) goto Found;else goto NoFound; NoFound: Console.WriteLine(i.ToSt ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十四周
java学习第十四周 本周,主要精力放在了第十二章swing用户界面组件知识的学习,swing是一个用于开发Java应用程序用户界面的开发工具包.它以抽象窗口工具包(AWT)为基础使跨 ...
- C#给图片加文字水印
public class TxtWaterMark { public enum WaterPositionMode { LeftTop,//左上 LeftBottom,//左下 RightTop,// ...