github项目地址:https://github.com/BiuBiuBangBoom/wc
PSP2.1
Personal Software Process Stages
预估耗时(分钟)
实际耗时(分钟)
Planning
计划
30
40
· Estimate
· 估计这个任务需要多少时间
180
240
Development
开发
150
180
· Analysis
· 需求分析 (包括学习新技术)
15
15
· Design Spec
· 生成设计文档
20
20
· Design Review
· 设计复审 (和同事审核设计文档)
20
25
· Coding Standard
· 代码规范 (为目前的开发制定合适的规范)
10
15
· Design
· 具体设计
18
15
· Coding
· 具体编码
120
150
· Code Review
· 代码复审
30
35
· Test
· 测试(自我测试,修改代码,提交修改)
10
10
Reporting
报告
15
20
· Test Report
· 测试报告
15
15
· Size Measurement
· 计算工作量
12
30
· Postmortem & Process Improvement Plan
· 事后总结, 并提出过程改进计划
15
15
合计
635
825
一.项目简介
能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有 wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
二.完成情况
基本功能:
[x] -c ,统计文件字符数。
[x] -w ,统计文件单词数。
[x] -l ,统计文件行数数。
扩展功能
[x] -s ,递归符合条件的文件。
[x] -a ,统计文件代码行,空白行,注释行。
说明:以上命令可叠加使用,即 -c -w -l ,统计文件的字符数,单词数和行数。
三.解题思路
1.利用正则表达式校验输入参数,然后解析出相关参数和文件地址。
2.利用正则表达式和BufferReader的readline()方法进行各种计数
四.设计流程
项目中含有一个包,里面里有一个实现功能的主类,及一个测试用的类。其中主类中包含主函数,递归处理文件函数,行计数函数,词计数函数,字符计数函数,拓展功能实现函数。
五.代码说明
递归收集文件夹下符合要求的文件
public voidgetFolders(String filepath) {
File file= newFile(filepath);
File[] folders=file.listFiles();if (folders.length == 0)return;else
for(File f : folders) {if(f.isDirectory())
getFolders(f.getAbsolutePath());//递归文件夹
else if (f.getName().endsWith("java"))
files.add(f);
}
}
计算词数
public void wordsCount(String filepath) throwsIOException {int count = 0;
File file= newFile(filepath);
BufferedReader br= new BufferedReader(newFileReader(file));
String line;
Pattern pa= Pattern.compile("[\u4e00-\u9fa5]");while((line = br.readLine()) != null) {
String[] str= line.split("\\W+");for(String word : str) {if(!word.equals("") && !pa.matcher(word).find())//检查是否有中文或空字符
count++;
}
}
System.out.println("词数:" +count);
br.close();return;
}
计算字符数
public void charCount(String filepath) throwsIOException {int count = 0;
File file= newFile(filepath);
BufferedReader br= new BufferedReader(newFileReader(file));
String line1, line2;while((line1 = br.readLine()) != null) {
line2= line1.replaceAll("\\s+", "");//将空白符删去
count +=line2.length();
}
System.out.println("字符数:" +count);
br.close();return;
}
计算行数
public void linesCount(String filepath) throwsIOException {int count = 0;
File file= newFile(filepath);
BufferedReader br= new BufferedReader(newFileReader(file));while(br.readLine() != null)
count++;
System.out.println("行数:" +count);
br.close();return;
}
拓展功能实现,计算空白行,注释行,代码行
public void advancedCount(String filepath) throwsIOException {int emptyLineCount = 0;int codeLineCount = 0;int comLineCount = 0;
File file= newFile(filepath);
BufferedReader br= new BufferedReader(newFileReader(file));
String line;while((line = br.readLine()) != null) {if(Pattern.compile("^\\s*\\S?\\s*$").matcher(line).matches())//检验空行
emptyLineCount++;else if(line.contains("//"))
comLineCount++;elsecodeLineCount++;
}
System.out.println("空行:" +emptyLineCount);
System.out.println("代码行:" +codeLineCount);
System.out.println("注释行:" +comLineCount);
br.close();return;
}
六.测试
程序启动
测试空文件
只有一个字符的文件
递归文件调用
七.项目总结
通过本次项目,我对于从前比较模糊的文件输入跟正则表达式有了较好的掌握,同时也对字符串类型方法有了更深的了解。在开发过程中,我经常遇到不知道如何实现某个功能,但通过查看文档往往会发现有很多很好用的方法,使我对功能的实现有了灵感。就此我深感文档对于开发的重要性。