个人项目:WC
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
GitHub地址:https://github.com/lllhhhyyy/mygit
基本功能列表
- -c [文件名] 返回文件的字符数(实现)
- -w [文件名] 返回文件词的数目(实现)
- -l [文件名] 返回文件的行数(实现)
扩展功能列表
- -s 递归处理目录下符合条件的文件。(实现)
- -a 返回更复杂的数据(代码行 / 空行 / 注释行)(实现)
- .处理通配符(未实现)
高级功能列表
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 | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· 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