1.Git地址
WordCount: 作业项目 https://gitee.com/Yuuotsu/WordCount
2.PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
60 |
40 |
· Estimate |
· 估计这个任务需要多少时间 |
|
|
Development |
开发 |
|
|
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
60 |
· Design Spec |
· 生成设计文档 |
20 |
10 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
5 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
5 |
· Design |
· 具体设计 |
20 |
20 |
· Coding |
· 具体编码 |
400 |
300 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
40 |
60 |
Reporting |
报告 |
60 |
90 |
· Test Report |
· 测试报告 |
30 |
30 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
20 |
|
合计 |
775 |
680 |
3.解题思路
完成三个功能:统计字符数、单词总数、总行数
- 字符数:读取文件中的字符,chars++
- 单词总数:以空白制表符为分隔,统计分隔后的字符串数
- 总行数:直接统计
- 准备
- 了解Java代码打开并读取文件内容
- 了解Java如何输出指定文件
- 了解Java代码如何打包成exe
- 实施
- 了解怎么通过Java代码打开文件
- 实现Java程序打开文件
- 实现功能1——统计文件中的字符数
- 实现功能2——统计文件中单词总数
- 实现功能3——统计文件总行数
- 实现返回值输出到指定文件中
- 程序汇总
4.代码实现
设计6个类来实现,打开文件、输出结果以及三个基本功能,另外还有一个主函数运行项目。
- l OpenFile类,定义参数content(文件内容)、lineCount(行数)、name(文件名字)
1 public static void openfile() { 2 String fileName; 3 // System.out.println("输入文件地址:"); 4 Scanner in = new Scanner(System.in); 5 fileName = in.next(); 6 7 File file = new File(fileName); 8 setName(fileName); 9 10 StringBuilder localStrBulider = new StringBuilder(); 11 if(file.isFile() && file.exists()) { 12 try { 13 InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file)); 14 BufferedReader bufferReader = new BufferedReader(inputStreamReader); 15 String lineStr = bufferReader.readLine(); 16 17 try { 18 while(lineStr != null) { 19 localStrBulider.append(lineStr); 20 lineStr = bufferReader.readLine(); 21 lineCount++;//记录行数 22 } 23 bufferReader.close(); 24 inputStreamReader.close(); 25 } catch (IOException e) { 26 // TODO Auto-generated catch block 27 System.out.println("文件读取失败"); 28 e.printStackTrace(); 29 } 30 } catch (FileNotFoundException e) { 31 // TODO Auto-generated catch block 32 System.out.println("文件不存在"); 33 e.printStackTrace(); 34 } catch (IOException e1) { 35 // TODO Auto-generated catch block 36 e1.printStackTrace(); 37 } 38 }else { 39 System.out.println("打开文件失败"); 40 } 41 42 setLineCount(getLineCount()); 43 setContent(localStrBulider.toString()); 44 45 46 47 48 }
- l CharNum类,统计字符数,定义参数countChar(记录字符数)、Result(记录字符数(传值))。在openFile方法中获取到文件内容并将其转换成了字符串,这里字符数直接统计该字符串content的长度即可。
1 public static void charNum() { 2 3 OpenFile.openfile();//打开文件 4 String Content = OpenFile.getContent();//获取openFile中的content值 5 6 setCountChar(Content.length());//字符数为字符串content的长度 7 setResult(OpenFile.getName()+" "+"字符数:" + getCountChar());//设置Result的值为文件名+字符长度 8 9 10 11 }
- l LineNum类,统计行数,定义参数Result(记录结果)。方法:在openFile中读取文件时BufferedReader的readLine()逐行读取,lineCount即行数。
1 public static void lineNum() { 2 3 OpenFile.openfile(); 4 setResult(OpenFile.getName()+" "+"行数:" + OpenFile.getLineCount()); 5 6 }
(这里其实是无用功,但为了和其他两个方法保持一直,也写了一个类)
- l WordNum类,定义参数Result(记录结果)。方法:使用split()方法,通过空白制表符分隔字符串,返回分隔后的字符串个数。
1 public static void wordNum() { 2 int countWord = 0; 3 4 5 OpenFile.openfile(); 6 String Content = OpenFile.getContent(); 7 8 countWord = Content.split("\\s+").length;//使用空白制表符分隔字符串 9 10 setResult(OpenFile.getName()+" "+"单词数:" + countWord); 11 }
- l OutFile类,定义了finalResult参数,用于表示程序最终结果。
1 public static void outFile(){ 2 3 /*System.out.println("输入标识符");*/ 4 5 String tag; 6 7 Scanner inn = new Scanner(System.in); 8 tag = inn.next(); 9 10 if(tag.equals("-c")) { 11 //字符 12 CharNum.charNum(); 13 setFinalResult(CharNum.getResult()); 14 } 15 else if(tag.equals("-w")) { 16 //字数 17 WordNum.wordNum(); 18 setFinalResult(WordNum.getResult()); 19 } 20 else if(tag.equals("-l")) { 21 //行数 22 LineNum.lineNum(); 23 setFinalResult(LineNum.getResult()); 24 } 25 26 FileWriter fileWriter = null; 27 try { 28 29 fileWriter = new FileWriter("D:/WordCount/result.txt", true); 30 System.out.println(finalResult); 31 fileWriter.write(finalResult);// 32 fileWriter.write(" ");// 33 fileWriter.flush(); 34 /*System.out.println("成功!");*/ 35 } catch (FileNotFoundException e) { 36 e.printStackTrace(); 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } finally { 40 if (fileWriter != null) { 41 try { 42 fileWriter.close(); 43 } catch (IOException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 } 48 } 49 50 51 }
测试结果
5.关于代码管理
一开始并没有使用Git来管理代码,之后才发现使用Git来管理确实省很多了。先前修改代码,为了防止修改后代码有问题,就会先注释掉先前的代码,再运行新的。但是最后在删除无用的大段注释的代码时,容易失误删掉有用代码。但是使用Git就会方便的多,也不需要大段大段注释,版本回溯能帮我完成这项功能。
6.小结
代码中的很多类其实做的是无用功,但是在一开始工作量计算失误,不合理地划分了类,也就按照计划上的写,导致有些类是不用存在的。所以计划设计部分很重要了,错误的计划设计就会导致后面做很多无用功。
写代码的过程其实不是最困难的,难的是最后打包过程。因为之前从来没有操作过Java代码打包成exe运行,虽然看了网上的一些教程还请教了长辈,最后还是存在一些问题。这方面的问题还是需要之后慢慢解决。