个人项目 wc.exe

GitHub地址:https://github.com/oAiuo/wordCount

一、题目描述

Word Count
1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。

 

二、项目要求

 

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

 

实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:

 

wc.exe [parameter] [file_name]

 

基本功能列表:

 

wc.exe -c file.c     //返回文件 file.c 的字符数

wc.exe -w file.c    //返回文件 file.c 的词的数目  

wc.exe -l file.c      //返回文件 file.c 的行数

 

说明:我在项目中file_name的定义为文件的路径

 

三、解题思路

看到要求时,涉及文件的操作,就联想到java的IO流操作。

  1. 统计文件字符数,使用字符输入流中的read方法可以得到该次read操作获取的字符数,重复操作即可。
  2. 统计单词数,则使用字符输入流中的readLine方法,获取一行的内容,对该字符串使用空格进行分割成字符串数组,则得到一行的单词数,重复操作即可。
  3. 统计行数,则同样使用readLine方法,统计该方法的使用次数即可。

 

四、设计实现过程

将文件的File对象、字符输入流和三个统计方法组成一个类,然后在main方法里,对命令行输入格式进行处理,读入文件的路径字符串生成对象,然后使用switch语句,运行不同的统计方法。

 

五、代码说明

0、定义的类的属性及构造器

 

    private File src;
    private BufferedReader input;
    
    public FileClass(String src) {
        this.src = new File(src);
        try {
            this.input = new BufferedReader(new FileReader(src));
        } catch (FileNotFoundException e) {
            System.out.println("File Not Found...\n");
        }

    }

 

 

 

1、统计字符数

 

    public void charNumCount() throws IOException {
        if(input == null)
            input = new BufferedReader(new FileReader(src));
        
        int charNum = 0, num = 0;
        char[] buffer = new char[1024];
        
        while( (num = input.read(buffer)) != -1 ) {
            charNum += num;
            System.out.println(buffer);
        }
        
        System.out.println("charNum : " + charNum );
        input.close();
        input = null;

    }

 

说明:定义一个缓冲字符数组,字符输入流的read(char[])方法可将读取到的内容存入该字符数组中,并返回读取到的字符数,每次累加该数即可。

由于统计的是文本文件,在文件的末尾有结束符,最后会返回-1,即读取结束。

另有发现,windows系统的换行符的确是"\r\n",有换行的情况的话,换行符会记为两个字符。

 

2、统计单词数

    public void wordNumCount() throws IOException {
        if(input == null)
            input = new BufferedReader(new FileReader(src));
        
        int wordNum = 0;
        String str = null;
        
        while( (str = input.readLine()) != null ) {
            String[] arr = str.split("\\s+");
            for(String temp : arr) {
                System.out.println("word: " + temp);
                wordNum++;
            }
        }
        
        System.out.println("wordNum : " + wordNum );
        input.close();
        input = null;
        
    }

说明:采用readLine()方法读取到一行的内容,然后使用split方法,以空格为分隔符分割字符串,得到字符串数组,统计一行中单词的个数,重复读取每行内容即可。

 

3、统计行数

    public void lineNumCount() throws IOException {
        if(input == null)
            input = new BufferedReader(new FileReader(src));
        
        int lineNum = 0;
        
        while( input.readLine() != null )
            lineNum++;
        
        System.out.println("lineNum :  " + lineNum );
        input.close();
        input = null;
                
    }

说明:同样采用readLine方法读取每一行的内容,当返回的内容为null时,即到文本末尾,变量存储读取成功的次数即可。

 

4、main方法

    public static void main(String[] args) throws IOException {
        if( args.length != 2)
        {
            System.out.println("-c filePath return charNum");
            System.out.println("-w filePath return wordNum");
            System.out.println("-l filePath return lineNum");
        }
        else {
            FileClass file = new FileClass(args[1]);
            
            switch(args[0]) {
                case "-c" :
                    file.charNumCount();
                    break;
                    
                case "-w" :
                    file.wordNumCount();
                    break;
                    
                case "-l" :
                    file.lineNumCount();
                    break;
                
                default :
                    System.out.println("-c filePath return charNum");
                    System.out.println("-w filePath return wordNum");
                    System.out.println("-l filePath return lineNum");
            }
        }
    }

说明:main方法参数即为命令行参数,对输入的参数进行合法性检验,并根据输入的功能选择不同的统计方法。

 

六、测试运行

1、空文件

  个人项目 wc.exe_第1张图片  个人项目 wc.exe_第2张图片

 

 

2、单字符文件

个人项目 wc.exe_第3张图片      个人项目 wc.exe_第4张图片

 

 

 

 

3、一行文件

个人项目 wc.exe_第5张图片  个人项目 wc.exe_第6张图片

 

 

 

 

 

4、典型文件

 

 个人项目 wc.exe_第7张图片  个人项目 wc.exe_第8张图片

 

 七、PSP

 

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 30

 45

· Estimate

· 估计这个任务需要多少时间

 20

 30

Development

开发

1440

 1400

· Analysis

· 需求分析 (包括学习新技术)

 180 

 300

· Design Spec

· 生成设计文档

 20

 30

· Design Review

· 设计复审 (和同事审核设计文档)

 10

 10

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 30

 20

· Design

· 具体设计

 120

 100

· Coding

· 具体编码

 900

 780

· Code Review

· 代码复审

 120

 120

· Test

· 测试(自我测试,修改代码,提交修改)

 60

 40

Reporting

报告

 120

 80

· Test Report

· 测试报告

 60

 30

· Size Measurement

· 计算工作量

 30

 30

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 20

合计

 

 1610

 1555

八、总结

  1. 经过这次项目,体会了软件开发的一个具体流程,对软件开发工程化有了一个比较具体的了解;
  2. 查阅资料时,有时可能会跑偏,点开的链接较多,总抓不住重点,时间浪费较多;
  3. 这次只完成了基础功能,编程能力有待提高。

 

你可能感兴趣的:(个人项目 wc.exe)