Word Count(java实现)

  Word Count

一、项目相关要求

  1.wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
  2.具体功能要求:
   程序处理用户需求的模式为:
   wc.exe [parameter] [file_name]
   3.基本功能列表:
   wc.exe -c file.c (已实现)     //返回文件 file.c 的字符数

      wc.exe -w file.c(已实现)    //返回文件 file.c 的词的数目  

      wc.exe -l file.c(已实现)      //返回文件 file.c 的行数

  4.扩展功能:
           -s   递归处理目录下符合条件的文件。
      -a   返回更复杂的数据(代码行 / 空行 / 注释行)。(已实现)
   空行:本行全部是空格或格式控制字符(//s+),如果包括代码,则只有不超过一个可显示的字符,例如“{”。
   代码行:本行包括多于一个字符的代码(匹配字符就+1。
   注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
      } //注释(出现//)
   在这种情况下,这一行属于注释行。
   [file_name]: 文件或目录名,可以处理一般通配符。
 
  5.高级功能:
   -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
  需求举例:wc.exe -s -a *.c
计算行数
   返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。
 

二、遇到的困难及解决办法

 
  1.困难描述:
  在编写程序的过程中,一直不得其解,如何才能知道是否读取文件成功,其次就是java中对于单词的表述和c是否是一致的,以及如何判断空行。
  2.做过哪些尝试:
  发现问题后,首先我先百度(java如何读取文件内容)发现这里面需要一个数据缓存流。找到解决办法后我去自学了I/O数据流的用法,经过多次尝试后大致学会了如何使用此方法来实现基础功能,
  对于空行起初我也利用数据流所附带函数".equals()"来判断,经过过次测试后发现这种方式并不是很适用,后选择了匹配规则+正则表达式的组合进行求解,效果显著。
 

三、关键代码

  1.计算字符

//计算字符数
    public  static void count(String filepart) throws IOException {
        int count = 0;
        File file = new File(filepart);//利用File效率更好一点
        BufferedReader br = new BufferedReader(new FileReader(file));
        String a, b;//设置a,b进行判断
            while((a = br.readLine()) != null)
            {  //排除空白符影响,s表示匹配任何空白字符,包括空格、制表符、换页符等等
                    b = a.replaceAll("\\s+", "");
                    count += b.length();
            }
        System.out.println("字符数为:" + count);
        br.close();//关闭流并释放资源
        return;
    }

 

   2.计算行数

 //计算行数
    public   static void linecount(String filepart)throws IOException {
        int linecount = 0;
        File file = new File(filepart);
        BufferedReader br = new BufferedReader(new FileReader(file));
            while(br.readLine() != null)
                linecount++;
        System.out.println("行数为:" + linecount);
        br.close();
        return;
        }

  3.计算词数

//计算词数
    public   static void wordcount(String filepart  )throws IOException {
        int wordcount = 0;
        File file = new File(filepart);
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
            while((line = br.readLine()) != null) {
                String[] str = line.split("\\w+");//\\w 匹配包括下划线的任何单词字符
                for(String word : str) {
                    if(!"".equals(line))//检查是否有空字符
                        wordcount++;
                }
            }
            System.out.println("词数为:" + wordcount);
            br.close();
            return;
    }

  4.计算空行数,代码行数,注释行数

//返回空行数,代码行数,注释行数
    public  static void  extracounts(String filepart) throws IOException{
        int number1 = 0,number2=0,number3=0;
        FileInputStream file = new FileInputStream(filepart);//此时用FileInputStream效果更加
        FileReader fr = new FileReader(filepart);
        BufferedReader br = new BufferedReader(fr);
        String line;
            while((line=br.readLine())!=null){
                //利用匹配与正则表达式来获取空行:^为起始,*为零次或多次,?为是否匹配,$终止
                   if(Pattern.compile("^\\s*\\S?\\s*$").matcher(line).matches())
                            number1++;
                else
                    if (line.contains("//"))
                            number2++;
                else
                            number3++;
            }
        System.out.println("空行:" +number1);
        System.out.println("注释行:" +number2);
        System.out.println("代码行:" +number3);
        br.close();
        return;
        }

  5.主体

//
        public static void main (String[]args) throws IOException {
           //读取文件
            Scanner scan = new Scanner(System.in);
                System.out.println("请输入目标源文件地址");//输入("g/练习程序/java.*)
            String uri = scan.next();//定义uri
                FileInputStream f = new FileInputStream(uri);//此时用字节效果较好
                FileReader fr = new FileReader(uri);
                BufferedReader br = new BufferedReader(fr);
            String test;
                if ((test = br.readLine()) != null)
                    System.out.println("读取成功哦");
                else
                    System.out.println("不存在文件呀!");
            //实现功能
            linecount(uri);
            count(uri);
            wordcount(uri);
            extracounts(uri);
                }
            }

四、测试

  1.空文件

  Word Count(java实现)_第1张图片Word Count(java实现)_第2张图片

 

  2.单个词+一空行

  Word Count(java实现)_第3张图片Word Count(java实现)_第4张图片

 

   3.单个字符

  Word Count(java实现)_第5张图片Word Count(java实现)_第6张图片

 

  4.一个完整的源文件

 Word Count(java实现)_第7张图片Word Count(java实现)_第8张图片

 

 

五、psp表格

 Word Count(java实现)_第9张图片

 

 

 结语:

  这个项目虽然难度较易,对我确实一个大的难题,从零开始学习一门语言并写出一个完整的程序来,对我来讲消耗精力确实很多。不过在此期间痛并快乐着,一次次的百度借鉴,一次次的搜索文档,一次次的修改,一次次的测试,这都是我从中收获的经验,这是美好的经历,也让我明白了程序并不是那木好写的,软件开发不是一个人,也不是一点时间就能完成的。它需要时间的沉淀,需要团队的协作。同时也让我认清了自己,知道自己的不足有太多,但我会继续加油的o=o。(https://github.com/iamdate/-)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Word Count(java实现))