软件工程:java实现wordcount基本功能
github链接:https://github.com/Nancy0611/wc
一:项目相关要求
该项目能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
程序处理用户需求的模式为:wc [parameter] [file_name]
二:项目功能完成情况
基本功能:
- wc -c <file> 统计文件的字符数(完成)
- wc -w <file> 统计文件词的数目(完成)
- wc -l <file> 统计文件的行数 (完成)
扩展功能:
- wc -s <file> 递归处理目录下符合条件的文件(已完成)
- wc -a <file> 返回更复杂的数据:代码行 / 空行 / 注释行(已完成)
说明:
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:} //注释,在这种情况下,这一行属于注释行。
高级功能:
wc -x [parameter] 这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。(未完成)
三:设计思路
获取输入命令行参数,利用正则表达式校验输入命令行是否符合格式
如果输入命令符合格式要求则利用split(" ")按照空格将命令拆开并存储于数组
获取命令数组的最后一个元素,即为待统计的文件名或目录
若输入为文件则直接进行统计,若输入为目录则通过递归处理目录下的文件
输入参数[-c] [-w] [-l] [-a] 初始值设为false,一旦输入将值置为true以此选择性地显示
根据不同的命令对数据进行相应的处理
字符数:获取每行的字符数,逐行叠加
- 词的数目:获取每行除去空格的字符数,逐行叠加
行数:利用readline()不为 null,逐行叠加
- 空行:利用正则表达式统计只含"{"或 "}"或 "\n"的行数
注释行:统计除去"//"、"{//"、"/*"开头、"*/"结尾、"/* 单行注释 */"、"/*多行注释*/"
- 代码行:总行数除去代码行和空行即可得
四:设计思路
五:代码说明
程序入口,获取输入命令行,检验后若符合格式,则将命令解析并调用相关功能函数
public static void main(String[] args) throws IOException { scan = new Scanner(System.in);
String commend=scan.nextLine();
boolean result=checkInput(commend);
//输入格式为:wc [parameter] [file_name] if(!result){
System.out.println("输入指令不符格式");
}else{
String[] comArray=commend.split(" ");
int comLength=comArray.length;
String File_name=comArray[comLength-1];//获取文件名
ArrayList<File> ff = new ArrayList<File>();
getFromFile_name(File_name); for(File perfile:file){
br=new BufferedReader(new FileReader(perfile));
countData(br);
}
status(comArray,comLength);//修改cwl状态
display(c,w,l,a);//显示
br.close();
}
}
正则表达式检验输入命令行格式
public static boolean checkInput(String input){//正则表达式校验输入命令行
boolean flag=false;
try{
String pattern="^wc\\s+(\\-[cwlas]\\s+){1,5}\\s*\\S+$";
Pattern regex=Pattern.compile(pattern);
Matcher matcher=regex.matcher(input);
flag=matcher.matches();
}catch(Exception e){
flag=false;
}
return flag;
}
根据输入文件名或文件路径获取文件
public static ArrayList<File> getFromFile_name(String path){
File f=new File(path);
file=new ArrayList<File>();
if(f.isFile()&&f.exists()){
file.add(f);
}else if(f.isDirectory()){
File[] files=f.listFiles();
for(File fis: files){
if(fis.isFile()){//文件
file.add(fis);
}else if(fis.isDirectory()){//目录
//System.out.println(fis.getAbsolutePath());
getFromFile_name(fis.getAbsolutePath());
}
}
}
return file;
}
根据输入命令行的解析结果修改c w l a的状态,输入含有以上字符则标记为true
public static void status(String[] comArray,int comLength){//修改cwla状态
for(int i=0;i<comLength;i++){
switch(comArray[i]){
case "-c":
c=true;
break; case "-w":
w=true;
break; case "-l":
l=true;
break; case "-a":
a=true;
break; default:
break;
}
}
}
根据标记的c w l a的值来选择显示的内容
public static void display( boolean c,boolean w,boolean l,boolean a){
//选择显示部分
if(c){
System.out.println("字符数:"+countChar);
}
if(w){
System.out.println("词的数目:"+countWord);
}
if(l){
System.out.println("行数:"+countLine);
}
if(a){
System.out.println("代码行:"+codeLine+"\n空行:"+blankLine+"\n注释行:"+commentLine);
}
}
计算功能
public static void countData(BufferedReader br){//计算部分
boolean comment=false;
try {
while((line=br.readLine())!=null){
/*统计字符数 */
countChar+=line.length();
/*统计词的数目 */
countWord+=line.split(" ").length;
/*统计行数 */
countLine++;
line=line.trim();
/* 统计空行*/
if(line.matches("[\\s&&[^\\n]]*$")){
blankLine++;
}else if(line.equals("{")||line.equals("}")){
blankLine++;
/* 统计注释行 */
}else if(line.startsWith("/*")&&!line.endsWith("*/")){
commentLine++;
comment=true;
}else if(true==comment){
commentLine++;
if(line.endsWith("*/")){
comment=false;
}
}else if(line.startsWith("//")){
commentLine++;
}else if(line.startsWith("/*")&&line.endsWith("*/")){
commentLine++;
}else if(line.startsWith("}//")){
commentLine++;
/*统计代码行 */
}else{
codeLine++;
}
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
六:测试截图
- 根据文件名统计(非递归)
输入命令
wc -c -l -w -a E:\test\test1.txt
文件截图:
测试结果:
- 根据文件路径统计(递归处理)
输入命令:
wc -s -c -l -w -a E:\test
文件截图:
E:\test\test1.txt
E:\test\seles\test2.txt
测试结果:
七:PSP时间统计
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 80 |
· Estimate | · 估计这个任务需要多少时间 | 200 | 300 |
Development | 开发 | 180 | 210 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 30 |
· Design Spec | · 生成设计文档 | 10 | 15 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 30 | 45 |
· Coding | · 具体编码 | 160 | 190 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 60 | 80 |
· Test Report | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 795 | 1055 |
八:项目总结
关于wordcount,首先,一开始的构思是先读取文件,一段时间没有使用java,对io流的相关内容不是很熟悉,成功将文件存进ArrayList中后我没有考虑到Array List变量之间的赋值问题,直接用=去赋值,发现取出的数据出错,经过上网搜索了解了关于ArrayList对象之间赋值该注意的问题,收获不少。其次,对输入指令格式的验证问题,由于之前没有接触过正则表达式,在正则表达式的相关内容上花费了挺多时间。最后,关于项目编程还是要多实践,本次课程设计一开始都是停留在想的阶段,一直没怎么实践,结果发现过去了挺长时间仍旧没有进度。经过这次课程设计,温习了java的相关内容,同时又发现了许多新的问题,在解决问题的过程受益匪浅。
软件工程:java实现wordcount基本功能的更多相关文章
- Spark:用Scala和Java实现WordCount
http://www.cnblogs.com/byrhuangqiang/p/4017725.html 为了在IDEA中编写scala,今天安装配置学习了IDEA集成开发环境.IDEA确实很优秀,学会 ...
- WordCount基本功能
WordCount基本功能 码云地址:https://gitee.com/Joker_zou/WordCount.git 一.项目需求 WordCount的需求可以概括为:对程序设计语言源文件统计字符 ...
- Java 基本数据类型 sizeof 功能
Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int 32b ...
- Java实现发邮件功能---网易邮箱
目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...
- Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比
Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比: Unix/Linux (Bash) Windows(MS-DOS) Java 进入目录 cd cd - 创建 ...
- ElasticSearch7.3学习(三十)----ES7.X SQL新特性解析及使用Java api实现sql功能
一.ES7 sql新特性 1.1 数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期 四个字段 PUT /tvs PUT /tvs/_mapping { "properties&quo ...
- 个人项目———Java实现WordCount
2018年系统分析与设计—个人项目作业 题目来自于 :https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/ ...
- Java实现WordCount
GitHub项目地址:https://github.com/happyOwen/SoftwareEngineering wordcount项目要求: 程序处理用户需求的模式为:wc.exe [para ...
- WordCount 基础功能
软测第一次作业 该项目在码云上的地址: https://gitee.com/zhege/WordCount 一,概述 WordCount的基础功能需求分析大致如下:对程序设计语言源文件统计字符数.单词 ...
随机推荐
- 善待Erlang 代码 -- Xref 实践
Xref 是一个交叉引用工具,通过分析定义的函数间的调用关系,用于查找函数. 模块. 应用程序和版本之间的依赖关系. 通俗而言,Xref 可以检查代码中函数的调用关系.比如在 moduleA 中的 f ...
- emacs之配置speedbar
安装sr-speedbar,这样的话,speedbar就内嵌到emacs里面了 emacsConfig/speedbar-setting.el (require 'sr-speedbar) (setq ...
- C#中XML文档注释编译DLL引用到其它项目
引用地址:http://zhidao.baidu.com/link?url=jSGYEBysE4gBExtNsHCVk3vd2OK2cMlaf02cS79GdRuGueTBdFJB0btOdBYkg_ ...
- istio 配置https gateway
沒有親手實驗,参考官方文档: https://istio.io/docs/tasks/traffic-management/secure-ingress/
- 【DataGuard】部署Data Guard相关参数详解 (转载)
原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler 有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Gua ...
- win7/64+python3.4+pyinstall3+tkinter+smtp=图形界面群发邮件客户端
#file: GUI_MAIL.py#Date: 2016/01/07#Author: lao_wan import tkinterimport smtplibfrom email.mime. ...
- 搭建双系统win10+ubuntu17.10
0. 序言 这里采用先装win10,再装ubuntu的顺序.这样可以避免后面系统启动项设置的问题.都采用UEFI引导方式,且使用usb2.0的u盘来引导(3.0的话,要准备好3.0的驱动).另外注意的 ...
- 数据库帮助类 SqlServerHelp
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Ant+jmeter+jenkins搭建测试的持续集成
前提: Ant+jmeter 已经搭建完成并成功运行(参看ant+jmeter自动化性能测试) Jenkins在本地已经安装可运行(参看上一篇) 1.下载Jenkins安装 2.浏览器输入地址http ...
- python大规模数据处理技巧之一:数据常用操作
面对读取上G的数据,python不能像做简单代码验证那样随意,必须考虑到相应的代码的实现形式将对效率的影响.如下所示,对pandas对象的行计数实现方式不同,运行的效率差别非常大.虽然时间看起来都微不 ...