Java实现WC基本功能
Posted qq760710450
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现WC基本功能相关的知识,希望对你有一定的参考价值。
GitHub仓库:https://github.com/douyazai/WCbase
一.WC 项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] [file_name]
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数(实现)
wc.exe -w file.c //返回文件 file.c 的词的数目 (实现)
wc.exe -l file.c //返回文件 file.c 的行数(实现)
扩展功能:
-s 递归处理目录下符合条件的文件。(未实现)
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。(实现)
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
[file_name]: 文件或目录名,可以处理一般通配符。
高级功能:
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。(未实现)
需求举例:
wc.exe -s -a *.c
返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。
二.解题思路
1.首先要对文件进行基本的读取操作,InputStreamReader(new FileInputStream(绝对文件名))进行文件的读取。
2.由于需要统计行数,所以用BufferedReader(文件读取)调用readLine()的方法。
3.功能的分配。
4.基本功能的实现。
三.遇到的问题及解决方法
1.不知道如何对字符串进行分割,不懂的正则表达式的使用。
解决方法:通过网上搜索其用法并且自己不断地修改才清楚如何对字符串进行分割。
四.设计过程
五.关键代码说明
1.获取从控制台输入的文件路径,将功能与文件路径根据空格分成两个字符串,首字符串可以确定返回的数据。
为了能够一行一行的获取信息,采用BufferedReader(文件读取)调用readLine()的方法。代码如下:
1 Scanner input = new Scanner(System.in); 2 String road = input.nextLine(); 3 String array[] = road.split("\\s"); 4 5 FileInputStream file = new FileInputStream(array[1]); 6 InputStreamReader isr = new InputStreamReader(file); 7 BufferedReader br = new BufferedReader(isr);
2.各功能的实现可在while和if语句下实现,因为是按行读取,所以每次增加一即可计算出行的数目。
1 while(br.read()!=-1) 2 { 3 String s = br.readLine(); 4 if (s.length() <= 1) // 判断空行 5 { 6 BlankLine++; 7 8 } 9 else 10 { 11 Charcount += s.length();//字符个数就是字符长度 12 Wordcount += s.split(" ").length;//split() 方法用于把一个字符串分割成字符串数组,字符串数组的长度,就是单词个数 13 CodeLine++; 14 } 15 Linecount = CodeLine + BlankLine ; 16 }
3.结果的输出采用switch语句,根据输入的-X功能的不同来选择返回的数据。
1 switch(array[0]) 2 { 3 case "-c": System.out.println("字符数 "+Charcount); 4 break; 5 case "-w": System.out.println("单词数 "+Wordcount); 6 break; 7 case "-l": System.out.println("总行数 "+Linecount); 8 break; 9 case "-a": System.out.println("代码行数 "+CodeLine); 10 System.out.println("注释行数:未实现"); 11 System.out.println("空白行数 "+BlankLine); 12 break; 13 case "-all":System.out.println("字符数 "+Charcount); 14 System.out.println("单词数 "+Wordcount ); 15 System.out.println("代码行数 "+CodeLine); 16 System.out.println("注释行数:未实现"); 17 System.out.println("空白行数 "+BlankLine); 18 System.out.println("总行数 "+Linecount); 19 break; 20 21 default: 22 System.out.println("参数输入不正确"); 23 }
六.测试
测试文件:
测试结果:
-all
-a
代码覆盖率:
因为有switch中的部分没有运行,所有覆盖率较低
七.总结
由于本身学习不到位,而且对于Java的开发少之又少,一年前学习的java现在已经几乎不会使用了,不得不从新翻开书本对知识点进行温习,但由于实践过少,对小项目的开发完全把不准。
清楚了一个软件开发者的工作量,虽然这次的项目简单,但对于基础差的我来说是一个大项目了,希望能够克服困难,边做边学,做到每天进步一点点。
PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
120 |
150 |
· Estimate |
· 估计这个任务需要多少时间 |
500 |
760 |
00Development |
开发 |
400 |
560 |
· Analysis |
· 需求分析 (包括学习新技术) |
200 |
160 |
· Design Spec |
· 生成设计文档 |
80 |
90 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
35 |
· Design |
· 具体设计 |
60 |
55 |
· Coding |
· 具体编码 |
500 |
560 |
· Code Review |
· 代码复审 |
40 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
22 |
40 |
Reporting |
报告 |
60 |
100 |
· Test Report |
· 测试报告 |
20 |
30 |
· Size Measurement |
· 计算工作量 |
50 |
40 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
38 |
合计 |
|
600 |
760 |
以上是关于Java实现WC基本功能的主要内容,如果未能解决你的问题,请参考以下文章