github项目:https://github.com/lilikai/Lk_test/blob/master/zuoye/src/com/zuoye/cn/wcCount.java
码云项目:https://gitee.com/jiansanzhihou/first_homework_wordcount/blob/master/WC/wcCount.java
1、项目要求:实现对文件内容里面的 字符、单词、行数的统计,并将结果输出在制定的文件里面,在命令行直接运行wc.exe,存储统计结果的默认文件为result.txt,和wc.exe在同级目录
2、基本功能:wc.exe -c file.c //返回文件 file.c 的字符数wc.exe -w file.c //返回文件 file.c 的单词总数wc.exe -l file.c //返回文件 file.c 的总行数wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数
3、基本功能列表:
1、 -c 文件路径 返回文件字符数
2、 -l 文件路径 返回文件内容行数
3、 -w 文件路径 返回文件单词数
4、 -o 文件路径 输出结果到制定文件
4、psp开发表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
30 |
50 |
· Estimate |
· 估计这个任务需要多少时间 |
350 |
350 |
Development |
开发 |
100 |
120 |
· Analysis |
· 需求分析 (包括学习新技术) |
100 |
130 |
· Design Spec |
· 生成设计文档 |
|
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
|
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
50 |
· Design |
· 具体设计 |
30 |
40 |
· Coding |
· 具体编码 |
200 |
300 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
50 |
70 |
Reporting |
报告 |
30 |
50 |
· Test Report |
· 测试报告 |
|
|
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
|
合计 |
660 |
910
|
5、表格分析:
从表格上可以看出,实际和预期的时间大部分相差不是很大,但是在编码和测试修改出现了很大的反差,究其原因还是在前面开发计划有问题,具体的编码规划没有制定好,编码之前的资料和工具没有准备充分导致编码阶段出现问题,当然后面的测试也会受到相应的影响,代码总是写完才去测试,没有进行模块化测试,导致时间超出预期的结果。
6、设计思路:
通过输入的命令来判断执行各个if函数,将输入的命令分割为两部分,第一部分是指令,第二部分是文件路径,
用指令来判断需要执行的if函数,文件路径作为参数。
字符统计:按行读取文件,把每行的字符数相加;
词数统计:把读取的数据记录下来,把多行拼接为一行,用空格替代标点符号,然后根据空格切割;
行数统计函数:根据JAVA的readLine功能统计;
设计思路图:
运行截图:
将java 项目转为可直接执行的exe 文件测试
7、部分代码:
/* * 获取文件目录名 */ InputStream iStream = System.in; InputStreamReader inputStreamReader = new InputStreamReader(iStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = bufferedReader.readLine(); String[] strings = str.split("\\s"); for (int i = 0; i < strings.length; i++) { if (strings[i].endsWith(".txt")) inputFile = strings[i]; } /** * 字符数统计 */ for (int i = 0; i < strings.length; i++) { if (strings[i].equals("-c")) { // -c对应字符个数统计 BufferedReader bff = new BufferedReader(new FileReader(inputFile)); String str1; String str2 = bff.readLine(); while ((str1 = str2) != null) { charnum = charnum + str1.length(); charnum++; if ((str2 = bff.readLine()) == null){ charnum--; } } bff.close(); String file = inputFile; file = file.substring(file.lastIndexOf("\\") + 1, file.length()); System.out.println(file + ",字符个数:" + charnum); } }
/** * 行数统计 */ for (int i = 0; i < strings.length; i++) { if (strings[i].equals("-l")) { // -l对应字符行数统计 BufferedReader bff = new BufferedReader(new FileReader(inputFile)); while (bff.readLine() != null) linenum++; bff.close(); String file = inputFile; file = file.substring(file.lastIndexOf("\\") + 1, file.length()); System.out.println(file + "文件总行数:" + linenum ); } } /** * 单词数统计 */ for (int i = 0; i < strings.length; i++){ if (strings[i].equals("-w")) { // -w对应字符个数统计 BufferedReader bff = new BufferedReader(new FileReader(inputFile)); StringBuffer sBuffer = new StringBuffer(); String str1; while ((str1 = bff.readLine()) != null) sBuffer = sBuffer.append(str1 + " "); str1 = sBuffer.toString(); /** * 把中英文标点符号都替换为“ ” */ String str2 = str1.replaceAll("[\\p{P}+~$`^=|<>~`$^+=|<>¥×]", " "); String[] str3 = str2.split("\\s+"); wordnum = str3.length; bff.close(); String file = inputFile; file = file.substring(file.lastIndexOf("\\") + 1, file.length()); System.out.println(file + "单词个数:" + wordnum); } }
8、总结:
在这个小项目公布以后,我觉得虽然这个一个非常小的项目,属于个人项目,如果以前没有学习软件工程系统分析的话。可能就直接在电脑上写代码,了解大致要实现的功能就行,就想着边写边改,有不会的上网百度就行,但是从软件项目的角度来看,这种完成的东西不能称之为软件,就只是一点程序代码而已,如果要称之为软件的话还缺少很 多的东西,因此,就借着这个小项目来具体按照软件工程的角度去实现它,完成它前期要做到对功能进行分析,对各个阶段的进行规划,进行需求分析,可行性分析等等,前期的准备都是为了后面做的时候能事半功倍。我做的这个小项目大致按照软件工程项目的流程走了一次,但是中间也有许多的问题和被忽视的东西,测试的话我直接是在编译器上写一段代码测试一段,而没有具体的进行单元测试,因为代码量不大,如果真正的大项目的话,我觉得单元测试是必不可少的。这次的作业完善的还是不好,只是让我能够体会到做一个项目不仅仅是写代码,更重要的是分析和规划我们的时间和需求功能,只有把这些基础工作做好了,右面的编程,测试就会很容易。
参考文献:java io 流详解https://www.cnblogs.com/xll1025/p/6418766.html
参考代码 :http://www.cnblogs.com/LYhah/p/9642534.html