1.码云地址:
https://gitee.com/zhuyao1/workCount
2.psp表格
PSP2.1表格
PSP2.1 | PSP阶段 | 预估耗时 (分钟) | 实际耗时 (分钟) |
Planning | 计划 | 30 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | 300 | 360 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 20 | 15 |
· Coding | · 具体编码 | 200 | 360 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 10 | 10 |
· Test Report | · 测试报告 | 20 | 10 |
· Size Measurement | · 计算工作量 | 20 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| 合计 | 785 | 960 |
3.需求功能分析
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
我拿到这个问题一开始想的就是要使用java的io流来读取文件,从而判断文件中的单词数,字符数等。
学习java的文件读取和写入。
4.程序设计
我总共设计了两个类:
1.程序的功能类,读取文件的字符,字数,行数。
1 public String count_word(String filename) throws IOException//统计单词数
2 {
3 ...
4 }
5
6 public String count_char(String filename) throws IOException//统计字符数
7 {
8 ...
9 } 10 11 public String count_line(String filename) throws IOException//统计行数 12 { 13 ... 14 } 15
2.main函数类,主要用于判断用户的命令,还有一个将结果写入文件的方法
1 public static void main(String[] args) throws IOException
2 {
3
4 ...
5 }
6 public static void output(String result) throws IOException
7 { 8 ... 9 }
5.具体编码(还有很多不足之处,希望各位提出意见)
功能类:
public String count_word(String filename) throws IOException//统计单词数
{
int wordnum=0;//单词数
File file =new File(filename);
int x=-1;
FileReader fReader=new FileReader(file);
while((x=fReader.read())!=-1)//按字符读文件,碰到符合条件的,单词数+1
{
char a=(char)x; if(a==' '||a==','||a=='.') { wordnum++; } } String result=filename+",单词数:"+wordnum;//保存结果 fReader.close();//关闭流 return result;//返回结果 } public String count_char(String filename) throws IOException//统计字符数 { int charnum=0;//字符数 File file=new File(filename); int x=-1; FileReader fReader=new FileReader(file); while((x=fReader.read())!=-1)//按字符读文件,判断,符合则字符加一 { char a=(char)x; if(a!='\n'&&a!='\r') { charnum++; } } String result=filename+",字符数:"+charnum;//保存结果 fReader.close();//关闭流 return result;//返回结果 } public String count_line(String filename) throws IOException//统计行数 { int line=0;//行数 File file=new File(filename); BufferedReader bReader;//缓冲区 bReader=new BufferedReader(new FileReader(file)); while(bReader.readLine()!=null)//对文件进行以行为单位读取,不为空则行数加一 { line++; } bReader.close();//关闭流 String result=filename+",行数:"+line;//保存结果 return result;//返回结果 }
main函数类:
public class cMain {
static String filepath="G:/eclipse/workCount/result.txt";//设置初始的文件输出路径,有-o命令就对其更改
public static void main(String[] args) throws IOException
{
workCount wCount=new workCount();//实例化workCount
List<String> comonds=new ArrayList<>();//创建list存储命令,即-c,-o等选项
List<String> filenames=new ArrayList<>();//创建list存储文件的路径
for(int i=0;i<args.length;i++)//遍历args,将命令和文件路径分开
{
if(args[i].startsWith("-"))
{
comonds.add(args[i]);//添加命令
} else{ filenames.add(args[i]);//添加文件的路径 } } String result="";//存储每一次返回的结果 for(int i=0;i<comonds.size();i++) { if(!comonds.contains("-o"))//判断命令中是否含有-o的命令 { for (int j = 0; j < filenames.size(); j++) { switch (comonds.get(i)) {//判断命令并执行 case "-c": result+=" "+wCount.count_char(filenames.get(j)); break; case "-l": result+=" "+wCount.count_line(filenames.get(j)); break; case "-w": result+=" "+wCount.count_word(filenames.get(j)); break; default: System.out.println("有命令错误"); break; } } output(result);//将结果输出至文件 } else {//有-o的命令,则最后一个文件路径则是想要输出的文件路径 filepath=filenames.get(filenames.size()-1);//对输出文件的路径进行更改 for (int j = 0; j < filenames.size()-1; j++) { switch (comonds.get(i)) {//判断命令并执行 case "-c": result+=" "+wCount.count_char(filenames.get(j)); break; case "-l": result+=" "+wCount.count_line(filenames.get(j)); break; case "-w": result+=" "+wCount.count_word(filenames.get(j)); break; default: System.out.println("有命令错误"); break; } } output(result);//将结果输出至文件 } } } public static void output(String result) throws IOException { File file=new File(filepath);//定义文件 if(!file.exists())//判断文件是否存在,不存在则直接创建新文件 { file.createNewFile(); } FileWriter fileWriter=new FileWriter(file); BufferedWriter bWriter=new BufferedWriter(fileWriter);//放入缓冲层 bWriter.write(result);//写入数据 bWriter.close();//关闭流 } }
6.对程序的基本测试
因为这个程序涉及args【】内的命令操作,在之前都比较陌生,后来参考了相关的文章,学习到了对其中命令的操作。
7.本程序的本机测试
将Java代码打包为jar文件,并转为exe可执行文件的方法
8.个人项目总结
在这一次的程序设计的过程中,我觉得是收获巨大的,我已开始拿到这个题目,说实话,脑壳痛,不过还是得做嘛,静下心来,一步一步分析,不会就去查,从一个项目之中,不仅学习到的是编程的知识,更多的是如何的一个人学习,在一个项目中你会去翻阅无数的资料,这我觉得才是,真正巨大的收获。这次还涉及到了,git码云的使用,我相信这个在以后的工作中,不一定会用到,但一定能提高我们的能力,自觉性。第一次写博客,写的不好,希望得到建议,谢谢!希望能帮助到人!