个人项目--WC(Java)
Posted lllm-li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人项目--WC(Java)相关的知识,希望对你有一定的参考价值。
Github地址: https://github.com/lllm-li/lllm
项目相关要求
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数(实现)
wc.exe -w file.c //返回文件 file.c 的词的数目 (实现)
wc.exe -l file.c //返回文件 file.c 的行数(实现)
扩展功能:
wc.exe -s 递归处理目录下符合条件的文件。(实现)
wc.exe -a 返回更复杂的数据(代码行 / 空行 / 注释行)。(实现)
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 40 | 60 |
Development | 开发 | 900 | 1200 |
· Analysis | · 需求分析 (包括学习新技术) | 180 | 150 |
· Design Spec | · 生成设计文档 | 40 | 60 |
· Design Review | · 设计复审 (和同事审核设计文档) | 40 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 60 |
· Design | · 具体设计 | 80 | 120 |
· Coding | · 具体编码 | 600 | 1000 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 60 |
Reporting | 报告 | 120 | 240 |
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 10 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 30 |
合计 | 2300 | 3150 |
解题思路
看清项目的需求,设计流程框架,结合开发语言写出实现函数所用的方法,通过查阅资料开始编写代码,检测代码,修改代码。
设计的实现
代码分为三大部分:测试类wc,管理类wcManage,功能实现类wildCard、blankLine等
关系结构如下图所示
代码说明
wc主类的测试
public static void main(String args[]) throws IOException { wcManage wcmanage=new wcManage(); File f1=new File(args[1]); String s=f1.getName(); wildCard fs=new wildCard(); File fk[]=fs.getFiles(f1.getParent(), s); for(File f:fk) { wcmanage.setFileDirectory(f.getAbsolutePath()); if(args[0].equals("-l")) { System.out.println(f); wcmanage.rowNumPrint(); } if(args[0].equals("-w")) { System.out.println(f); wcmanage.wordNumPrint(); } if(args[0].equals("-c")) { System.out.println(f); wcmanage.characterNumPrint(); } if(args[0].equals("-a")) { System.out.println(f); wcmanage.blankLinePrint(); wcmanage.codeLinePrint(); wcmanage.commentLinePrint(); } } if(args[0].equals("-s"))wcmanage.recursivePrint(); }
wcManage类管理方法
String fileDirectory; void rowNumPrint(){ rowNum rn=new rowNum(); rn.setFileDirectory(fileDirectory); rn.rowNum(); System.out.println("行数:"+rn.rownum); } void wordNumPrint(){ wordNum wn=new wordNum(); wn.setFileDirectory(fileDirectory); wn.wordNum(); System.out.println("词数:"+wn.wordnum); } void characterNumPrint(){ characterNum cn=new characterNum(); cn.setFileDirectory(fileDirectory); cn.characterNum(); System.out.println("字符数:"+cn.characternum); } void blankLinePrint() { blankLine bl=new blankLine(); bl.setFileDirectory(fileDirectory); bl.blankLine(); System.out.println("空行数:"+bl.blankline); } void codeLinePrint() { codeLine cl=new codeLine(); cl.setFileDirectory(fileDirectory); cl.codeLine(); System.out.println("代码行:"+cl.codeline); } void commentLinePrint() { commentLine cl=new commentLine(); cl.setFileDirectory(fileDirectory); cl.commentLine(); System.out.println("注释行:"+cl.commentline); } void recursivePrint() { Recursive r=new Recursive(); r.setFileDirectory(fileDirectory); System.out.println("所查询匹配的文件:"); r.Recursive(); } void setFileDirectory(String fileDirectory) { this.fileDirectory=fileDirectory; }
空行数
public void blankLine(){//读取空行数 try { String s; String s1[]; Pattern p=Pattern.compile(REGEX); BufferedReader br=new BufferedReader(new FileReader(fileDirectory)); while((s=br.readLine())!=null) { if(s.matches("[\\s]*")) blankline++; else { s1=p.split(s.trim()); if(s1[0].length()==1&&s1.length==1)blankline++; } } br.close(); }catch(Exception e) { } }
字符数
public void characterNum(){//读取字符数 try { String s; String s1[]; Pattern p=Pattern.compile(REGEX); BufferedReader br=new BufferedReader(new FileReader(fileDirectory)); while((s=br.readLine())!=null) { if(s.matches("[\\s]*")) continue; else { s1=s.split(REGEX); for(int i=0;i<s1.length;i++)characternum+=s1[i].length(); } } br.close(); }catch(Exception e) { } }
代码行
public void codeLine() {//读取代码行 try { String s; String s1[]; Pattern p=Pattern.compile(REGEX); BufferedReader br=new BufferedReader(new FileReader(fileDirectory)); while((s=br.readLine())!=null) { if(s.matches("[\\s]*")) continue; else { s1=p.split(s.trim()); if(s1.length>1||s1[0].length()>1)codeline++; } } br.close(); commentLine cl=new commentLine(); cl.setFileDirectory(fileDirectory); cl.commentLine(); codeline-=cl.commentline; }catch(Exception e) { } }
注释行
public void commentLine() {//读取注释行 try { String s; int i=0,j=0; BufferedReader br=new BufferedReader(new FileReader(fileDirectory)); while((s=br.readLine())!=null) { i++; if(s.indexOf("//")!=-1)commentline++; if(s.indexOf("/*")!=-1) j=i; if(s.indexOf("*/")!=-1) commentline+=i-j+1; } br.close(); }catch(Exception e) { } }
递归处理
public void Recursive() {//读取目录下的文件 File file=new File(fileDirectory); file=new File(file.getParent()); fs=file.listFiles(); for(File f:fs) { if(!f.isDirectory()) { System.out.println(" "+f); }; } }
行数
public void rowNum(){//读取行数 try { String s; BufferedReader br=new BufferedReader(new FileReader(fileDirectory)); while((s=br.readLine())!=null) { rownum++; } br.close(); }catch(Exception e) { } }
通配符
public static File[] getFiles(String filepath,String filename) { File file = new File(filepath); filename=filename.replace("*", ".*"); filename=filename.replace("?", ".?"); Pattern p = Pattern.compile(filename); ArrayList<File> list = filePattern(file, p); File f[]= new File[list.size()]; return list.toArray(f); } private static ArrayList<File> filePattern(File file, Pattern p) { if (file.isFile()) { Matcher matcher= p.matcher(file.getName()); if (matcher.matches()) { ArrayList<File> list = new ArrayList<File>(); list.add(file); return list; } } else if (file.isDirectory()) { File[] files = file.listFiles(); if (files!=null && files.length>0) { ArrayList<File> list = new ArrayList<File>(); for (int i = 0; i < files.length; i++) { ArrayList<File> rlist =filePattern(files[i], p); if (rlist != null) { list.addAll(rlist); } } return list; } } return null; }
词数
public void wordNum(){//读取词的数目 try { String s; Pattern p=Pattern.compile(REGEX); BufferedReader br=new BufferedReader(new FileReader(fileDirectory)); while((s=br.readLine())!=null) { if(s.matches("[\\s]*"))continue; wordnum+=p.split(s).length; } br.close(); }catch(Exception e) { } }
测试文件
测试结果:
遇到的困难:
通配符模式的实现,无法得到所写字符串变成正则表达式。
解决办法:
通过查询资料得到 Pattern p=Pattern.compile(REGEX);即可将所要字符串变成正则表达式
总结:
结构清晰,但是代码冗余量较大,实现基本功能和扩展功能。同时也学会了github上传的方法。测试代码要具有代表性,否则会导致漏掉细节而导致功能出错,同时也复习了正则表达式,了解了项目开发的基本流程,收获还是很大的。
改进原代码可以把基本功能和扩展功能一并写到一个类,这样可以减少代码的冗余量。
以上是关于个人项目--WC(Java)的主要内容,如果未能解决你的问题,请参考以下文章