java实现WC项目

个人项目:WC

   wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。

  GitHub地址:https://github.com/lllhhhyyy/mygit

  基本功能列表

  1. -c    [文件名]  返回文件的字符数(实现)
  2. -w   [文件名]  返回文件词的数目(实现)
  3. -l     [文件名]  返回文件的行数(实现)

扩展功能列表

  1. -s   递归处理目录下符合条件的文件。(实现)
  2. -a   返回更复杂的数据(代码行 / 空行 / 注释行)(实现)
  3. .处理通配符(未实现)

高级功能列表

1.  -x显示图形界面(未实现)

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划  30  60
· Estimate · 估计这个任务需要多少时间  240  300
Development 开发  60 120 
· Analysis · 需求分析 (包括学习新技术)  120  240
· Design Spec · 生成设计文档  60 120
· Design Review · 设计复审 (和同事审核设计文档)  60  
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)
· Design · 具体设计  60 100 
· Coding · 具体编码  60 100 
· Code Review · 代码复审  20 20 
· Test · 测试(自我测试,修改代码,提交修改)  60 120 
Reporting 报告  30 30 
· Test Report · 测试报告  30 30 
· Size Measurement · 计算工作量  20 30 
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划  30
30

  合计 880
1270

     

关键代码

 1 package wc_lhy;
 2 import java.io.File;
 3 import java.io.IOException;
 4 import java.util.HashMap;
 5 import java.util.Scanner;
 6 import java.util.regex.Matcher;
 7 import java.util.regex.Pattern;
 8
 9
10 public class Deal {
11
12
13     public static void main(String []args) throws IOException{
14
15         HashMap<String, Boolean> orderMap = new HashMap<>();
16         String standar;
17         Pattern pattern;
18         Matcher matcher;
19
20         orderMap.put("countLine", false);
21         orderMap.put("countChar", false);
22         orderMap.put("countWords", false);
23         orderMap.put("handleAll", false);
24         orderMap.put("complex", false);
25
26         //校验格式
27         @SuppressWarnings("resource")
28         Scanner scanner = new Scanner(System.in);
29         String order = scanner.nextLine();
30         //校验标准
31         standar = "^wc.exe\\s\\-[wacsl]{1,3}\\s.{0,}";
32         //匹配输入格式是否正确
33         pattern = Pattern.compile(standar);
34         matcher = pattern.matcher(order);
35         if(!matcher.matches()){
36             System.out.println("请输入正确的命令格式");
37         }
38
39         //校验输入格式正确后,对输入命令按空格进行分割
40         String[] splitOrder = order.split("\\s+");
41
42         /*对输入命令分析需执行功能*/
43         String string = "\\-[wscal]";
44         //String path = splitOrder[splitOrder.length-1];
45         String path = splitOrder[splitOrder.length-1];
46         File file = new File(path);
47         for (int i = 1; i < splitOrder.length-1; i++) {
48             pattern = Pattern.compile(string);
49             Matcher matcher2 = pattern.matcher(splitOrder[i]);
50             if(matcher.matches()&&splitOrder[i].equals("-s")){
51                 orderMap.put("handleAll", true);//处理所有文件
52             }
53             else if (matcher2.matches()&&splitOrder[i].equals("-w")) {
54                 orderMap.put("countWords", true);//处理单词
55             }
56             else if(matcher2.matches()&&splitOrder[i].equals("-c")){
57                 orderMap.put("countChar", true);//处理字符
58             }
59             else if(matcher2.matches()&&splitOrder[i].equals("-l")){
60                 orderMap.put("countLine", true);
61             }
62             else if(matcher2.matches()&&splitOrder[i].equals("-a")){
63                 orderMap.put("complex", true);//复杂功能
64             }
65             else {
66                 System.out.println("出错!");
67             }
68         }
69
70         Handle handle = new  Handle(orderMap, path);
71
72         //-s路径非文件夹
73         if(file.isDirectory()&&(orderMap.get("handleAll")==false)) System.out.println("非目录操作!请输入文件路径");
74         //-s操作+路径为文件夹
75         if (orderMap.get("handleAll")&&handle.isFolder()) {
76             handle.handleFoler(path);
77         }
78         //-s操作但路径不正确
79         else if((orderMap.get("handleAll") == true)&&(handle.isFolder() == false)){
80             System.out.println("请输入一个目录!");
81         }
82         //非-s操作且路径非文件夹啊
83         else if((orderMap.get("handleAll") == false)&&(handle.isFolder() == false)){
84             handle.judgeCount(path);
85             System.out.println("ok");
86         }
87
88     }
89}

-s功能,实现对目录所有文件的递归:

 1     /*对文件夹进行的操作*/
 2     public void handleFoler(String folderPath){
 3         this.path = folderPath;
 4         File file = new File(path);
 5         //System.out.println("路径为"+file.getAbsolutePath());
 6         File[] listFile = file.listFiles();
 7         if(listFile==null){
 8             return;
 9         }
10         for(int i = 0; i< listFile.length; i++){
11             //非文件夹,即可进行对文件进行处理
12              if(!listFile[i].isDirectory()){
13                 System.out.println("文件路径:"+listFile[i].getAbsolutePath());
14                 System.out.println("文件名:"+listFile[i].getName());
15                 try{
16                     judgeCount(listFile[i].getAbsolutePath());
17                 } catch (IOException e) {
18                     // TODO Auto-generated catch block
19                     e.printStackTrace();
20                 }
21             }
22              else{
23                      //为文件目录,递归处理
24                     System.out.println("文件目录路径"+file.getAbsolutePath());
25                     handleFoler(listFile[i].getAbsolutePath());
26              }
27
28         }
29     }

-l 实现行数统计:

 1     public   void  countLine(String path) throws IOException {
 2         InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path));
 3         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 4         while (bufferedReader.read()!=-1) {
 5             String string = bufferedReader.readLine();
 6             countLine++;//行数
 7         }
 8         bufferedReader.close();
 9         System.out.println("行数: "+getCountLine());
10     }

-c 实现字符数统计:

 1 public   void  countChar(String path) throws IOException {
 2         InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path));
 3         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 4         while (bufferedReader.read()!=-1) {
 5             String string = bufferedReader.readLine();
 6             if(string != null){
 7             countChar = countChar + string.length();//字符个数
 8             }
 9         }
10         bufferedReader.close();
11         System.out.println("字符数: "+getCountChar());
12     }

-w 实现单词数统计:

 1     public   void  countWords(String path) throws IOException {
 2         InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(path));
 3         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 4         while (bufferedReader.read()!=-1) {
 5             String string = bufferedReader.readLine();
 6
 7             if(string != null){
 8             countWords = countWords + string.split("\\s").length;//词的个数
 9             }
10
11         }
12         bufferedReader.close();
13         System.out.println("单词数:" + getCountWords());
14     }

-a 统计代码行、空行、注释行:

 1 //计算代码行,注释行。空白行
 2     @SuppressWarnings("resource")
 3     public void countComplex(String filePath) throws IOException {
 4         InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(filePath));
 5         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 6         //注释行匹配
 7         Pattern commetPattern = Pattern.compile("(^//.*$)|(^/\\*.*\\*/$)|(^/\\*\\*.*$)|(^\\*.*$)|.*\\*/$",
 8                 Pattern.MULTILINE + Pattern.DOTALL);
 9         //空白行匹配
10         Pattern nullPattern = Pattern.compile("^\\s*$");
11         //代码行匹配
12         Pattern codePattern = Pattern.compile("\\s*",
13                 Pattern.MULTILINE + Pattern.DOTALL);
14         //System.out.println(9);
15         String row;
16         while ((row = bufferedReader.readLine())!= null) {
17             if(nullPattern.matcher(row).find()){
18                 countNull++;
19             }
20             //注释
21              if ((row!=null)&&commetPattern.matcher(row).matches()) {
22                 commetLine++;
23             }
24             //代码行
25              if((row!=null)&&codePattern.matcher(row).find()) {
26             //else {
27                 codeLine++;
28             }
29         }
30         codeLine = codeLine - commetLine-countNull;
31     }    

代码测试:

测试文件:

运行结果:

测试文件:

运行结果:

测试文件:

项目总结:

  完成了这个项目,感觉收获还是挺多的。首先是加强了自己对java编程的熟悉度,还有就是正则表达式,以前只是囫囵吞枣得匆匆看了一遍,实战是发现自己完全不会用,于是再去认真学习了一遍。在做这个项目的 过程中也是发现了自己存在的一些问题,首先就是算法不过关,考虑不全面,写的也不够精简,所以常常会抛空指针的错误,不过有错误还是挺好的,解决自己的错误才能更好的进步,在以后的编程中才会更加的小心。还有就是在刚开始时会觉得无从下手,特别是对正则表达式不熟悉,不知道要从哪里入手,因此开始编程浪费了挺多时间的。经过这次给了自己以后的一个小经验:即使问题很难,也要尝试着去动手。不要浪费时间去空想,着手,然后一个个的把这些问题解决掉。

原文地址:https://www.cnblogs.com/123-lhy/p/9644775.html

时间: 2024-11-09 05:02:10

java实现WC项目的相关文章

软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c 统计文件字符数支持 -w 统计文件单词数支持 -l 统计文件总行数 2.拓展功能 支持 -a 返回高级选项(代码行 空行 注释行)支持 -s 递归处理符合条件的文件 3.高级功能 支持 -x 程序以图形界面与用户交互 [filename] 是

小白のjava实现wc.exe功能

GitHub地址 项目完成情况 基本功能列表(已实现) wc.exe -c file.c     //返回文件 file.c 的字符数 wc.exe -w file.c    //返回文件 file.c 的词的数目 wc.exe -l file.c      //返回文件 file.c 的行数 扩展功能(已实现) -s   递归处理目录下符合条件的文件.    -a   返回更复杂的数据(代码行 / 空行 / 注释行). 空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的

java实现wc

github项目传送门:https://github.com/yanghuipeng/wc 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行数. 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 基本功能列表 -c    [文件名]  返回文件的字符数 -w   [文件名]  返回文

Java实现WC基本功能

GitHub仓库:https://github.com/douyazai/WCbase 一.WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行数. 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件.具体功能要求:程序处理用户需求的模式为: wc.exe [parameter] [f

Java实现WC.exe功能

1 WC 项目要求 项目地址:https://github.com/LIBULULU/yy wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行数. 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能要求: 程序处理用户需求的模式为: wc.exe [parameter] [file_na

Java程序设计基础项目总结报告

Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现的密码算法包括:对称密码算法,非对称密码算法,消息摘要算法. 2.要求完成对每个算法中的public类进行TDD测试,测试代码尽可能多,并且应尽可能涵盖特殊符号.数字.字母等输入字符. 3.设计每个密码算法的GUI界面,提供输入输出区域供使用者输入.查看. 三.计划明细 周数 进度安排 备注 Wee

Java新手练习项目、毕业设计项目源码下载

最近自己做了个技术博客网站,整理了一下学习java过程中做的例子和小项目,都放在了网站了提供下载,有新手入门的例子,也有java web例子,还有本人大学期间的毕业设计源码,都可以下载.地址:微儿博客-Java新手练习项目.毕业设计项目源码下载

Java Web入门项目之“网络交友”的设计与实现

前言:这个小项目是我刚学习JSP时,参考"JSP程序设计"这本书写的.这里之所以说参考这本书而不是照着这本书写,主要是因为我自己完成的时候删掉了不少繁琐的写法(比如:文件上传):同时对书中容易产生SQL注入漏洞,XSS跨站脚本漏洞等地方的写法进行了修改过滤:登录页面加上了随机验证码.除此之外,还添加了文件管理功能 PS:整个项目没有特别的难点,可以分为一个个功能点实现,大神轻喷,个人认为对初学Java Web的童鞋还是有参考意义的 注:整个项目的完整源代码和sql文件我会在文末给出下载

java添加菜单项目

java添加菜单项目,布布扣,bubuko.com