项目作业WordCount

1.Git地址

WordCount: 作业项目  https://gitee.com/Yuuotsu/WordCount

 源作业要求 https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2120

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     }

测试结果

 项目作业WordCount_第1张图片

 

5.关于代码管理

一开始并没有使用Git来管理代码,之后才发现使用Git来管理确实省很多了。先前修改代码,为了防止修改后代码有问题,就会先注释掉先前的代码,再运行新的。但是最后在删除无用的大段注释的代码时,容易失误删掉有用代码。但是使用Git就会方便的多,也不需要大段大段注释,版本回溯能帮我完成这项功能。

 

6.小结

代码中的很多类其实做的是无用功,但是在一开始工作量计算失误,不合理地划分了类,也就按照计划上的写,导致有些类是不用存在的。所以计划设计部分很重要了,错误的计划设计就会导致后面做很多无用功。

写代码的过程其实不是最困难的,难的是最后打包过程。因为之前从来没有操作过Java代码打包成exe运行,虽然看了网上的一些教程还请教了长辈,最后还是存在一些问题。这方面的问题还是需要之后慢慢解决。

你可能感兴趣的:(项目作业WordCount)