wc作业的JAVA实现
Github项目地址传送门
(PSP表格在最后给出)
项目相关要求
- 1.基本功能
- -c,统计文件的字符数(完成)
- -w,统计文件的词的数目(完成)
- -l,统计文件的行数(完成)
- 2.拓展功能
- -s,递归处理目录下符合条件的文件(未完成)
- -a,返回更复杂的数据(代码行 / 空行 / 注释行)(未完成)
解题思路
WC这个项目主要有两个部分组成:
1.有关基本功能的实现设计;
2.读取测试文件;
基本功能的实现设计比较简单,如果用Java的角度,用read的方式按字符读取文件内容。
字符数:读取的过程中,空格键字符数+1,回车键字符数+2,所以要去除掉这两个才能计算出不计空格和回车的字符数;
行数:以回车数+1就能统计文件的总行数;
单词数:通过判断前后是否有空格来统计单词的数目。
文件读取这个方面比较难,因为我对java的输入流不太熟悉,上网查资料查到可以用文件或者路径的方式来读取文件,因为只用文件方式有几率会找不到该文件,所以我就只用读取路径的方式来打开文件。
设计
testcount类:
变量:chars, words, lines. 基本功能的表示。
方法:calculate 基本功能的实现方法。
switch(arr[0]) 对功能进行分类并打印输出结果。
主要流程:用文件输入流一个字符一个字符读取文件,以判断当前读取位置是否为文本末尾为结束条件进行循环,计算chars,words,lines。然后在主类设计读取文件路径的方法,并对功能进行分类实现。读取路径用split(“\\s”)的方法来表达。
关键代码
1.实现基本功能
1 public static int words = 1; 2 public static int lines = 1; 3 public static int chars = 0; 4 public static int space = 0; 5 6 7 8 public static void calculate(String s) throws IOException { 9 FileInputStream f = new FileInputStream(s); 10 // 根据前后空格来判断是否为单词 11 boolean notblank = false; 12 String blank = " \t\n\r"; 13 int c; 14 while ((c = f.read()) != -1) { 15 chars++; 16 if(c == '\n') lines++;//计算行数 17 if(c == ' ') space++; 18 if(blank.indexOf(c) != -1) { 19 if(notblank) { 20 words++; 21 } 22 notblank = false; 23 } else { 24 notblank = true; 25 } 26 }if(chars==0) {words=0;lines=0;}//空文件
2.文件读取及功能分类
1 System.out.print("请输入命令:"); 2 Scanner s = new Scanner(System.in); 3 String m = s.nextLine(); 4 String arr[]= m.split("\\s"); 5 6 // 根据获取指令来执行函数 7 try { 8 switch (arr[0]){ 9 //打印输出结果 10 case "-c": textcount.calculate(arr[1]); 11 if(chars==0) System.out.println 12 ("本文件共有字符数:" + chars);//空文件情况 13 else{ 14 System.out.println 15 ("本文件共有字符数:" + (chars-(lines-1)*2-space));}//不计空格和换行 16 break; //返回文件字符数 17 18 case "-w": textcount.calculate(arr[1]); 19 System.out.println("本文件共有单词数:" + words+"\n"); 20 break; //返回文件单词数目 21 22 //空行也计算在内 23 case "-l": textcount.calculate(arr[1]); 24 System.out.println("本文件共有行数:" + lines+"\n"); 25 break; //返回文件行数 26 27 case "-cwl": textcount.calculate(arr[1]); 28 if(chars==0) System.out.println("本文件共有字符数:" + chars); 29 else{ 30 System.out.println 31 ("本文件共有字符数:" + (chars-(lines-1)*2-space));} 32 System.out.println("本文件共有单词数:" + words); 33 System.out.println("本文件共有行数:" + lines); 34 35 break; 36 37 default: System.out.println("\n不存在该指令!"+"\n");break; 38 } 39 } catch (FileNotFoundException e) {//读取失败 40 System.out.println("\n不存在该文件路径!"); 41 } catch (IOException e){ 42 System.out.println("\n文件读取错误!"); 43 }System.out.println("运行结束,感谢您的使用");break;
测试截图
1.正常测试文件,我一般都会把文件存在自己的d盘。

2.测试文件2,因为以回车键标准来数行,所以在该测试文件中空白行也算一行。

3.空文件

4.只有一个单词的文件,一个字符也算一个单词。

5.随便找了以前做的一个C语言源文件来做测试。

6.文件查找失败。

遇到的困难及解决方法
1. 在计算字符数的时候在考虑空文件情况的时候结果不是预期的,一开始都是在想判断文件为空这个方式。不过稍微往简单的想空文件就是一开始就到文件末尾,统计的字符数为零,所以根据这个思路补充这个情况:当char为零时,行数和单词书都置为零。
2.因为对Java不熟悉,所以对读取文件路径的方法需要上网查资料,用split的方法来输入文件路径。
3.输入文件名的时候不支持空格,解决方法尚未知。
PSP
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 35 | 45 |
| · Estimate | · 估计这个任务需要多少时间 | 35 | 45 |
| Development | 开发 | 505 | 732 |
| · Analysis | · 需求分析 (包括学习新技术) | 40 | 47 |
| · Design Spec | · 生成设计文档 | 25 | 0 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 15 |
| · Design | · 具体设计 | 40 | 70 |
| · Coding | · 具体编码 | 300 | 540 |
| · Code Review | · 代码复审 | 20 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 40 | 40 |
| Reporting | 报告 | 210 | 180 |
| · Test Report | · 测试报告 | 150 | 120 |
| · Size Measurement | · 计算工作量 | 30 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| 合计 | 750 | 957 |
经验小结
设计思路方面想的过于简单,只有大致方向,细化方面比预期再花多了一点时间。由于对Java语言不太熟悉,所以即使想到了算法,但是在实现的代码编写方面遇到了很多磕磕绊绊的过程,有时候想了几十分钟还是不知道怎么写。因为想不到更优的语法,所以代码规范方面也没想的太仔细,代码复审也没有花很多的时间。测试方面因为都是一个一个文件路径输进去的,所以稍微花了点时间。通过这次项目设计,让我意识到如果不去回顾编程语言,很久不去实践的话,代码编程的技术会生疏很多,所以还是要不定时的去回顾一下编程语言。

浙公网安备 33010602011771号