小白のjava实现wc.exe功能

时间:2022-09-09 22:56:02

GitHub地址


项目完成情况

  基本功能列表(已实现)

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

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

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

  扩展功能(已实现)

     -s   递归处理目录下符合条件的文件。
        -a   返回更复杂的数据(代码行 / 空行 / 注释行)。

      空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

      代码行:本行包括多于一个字符的代码。

      注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

          } //注释
      在这种情况下,这一行属于注释行。

      [file_name]: 文件或目录名,可以处理一般通配符。

  高级功能(未实现)

    -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

    需求举例:
      wc.exe -s -a *.c        返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。

PSP2.1表格预估

小白のjava实现wc.exe功能

解题思路

  用java实现wc.exe文件:实现3个基本功能,必须通过输入流接收文件内容。实现“-s”扩展功能,则需要通过递归,将文件名存入字符串列表,之后循环输出。实现“-a”扩展功能,我的思路是用readLine()方法将源文件一行一行接收,然后通过条件语句判断;而判断的顺序是:先判断是否是空行,再判断是否为注释行,除去这两种,剩下的就都是代码行了。

代码说明

  统计字符数方法:countCharacter()

    filePath:文件路径

    用BufferedReader中的read()方法读取字符并进行判断:是否为可以用键盘键入的字符【ASCII码大于等于32,且不等于127(DEL)】,如果是,字符数加1。

 public void countCharacter(String filePath) throws IOException {
     int character=0;
     BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
     int i;
     while(-1!=(i=br.read()))
         if(i>=32&&i!=127) character++;//只计入键盘输入的字符
     br.close();
     System.out.println("字符数:"+character);
 }

  统计行数方法:countLine()

    filePath:文件路径

    用BufferedReader中的readLine()方法读取每行字符,每读取一行,行数加1。

 public void countLine(String filePath) throws IOException {
     int line=0;
     BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
     while(null!=br.readLine()) line++;
     br.close();
     System.out.println("行数:"+line);
 }

  统计单词数方法:countWord()

    filePath:文件路径

    用BufferedReader中的readLine()方法读取一行字符并存入str中,然后用replaceAll()方法将字符串中,非字母、单引号(')、下划线(_)、连接符(-)的字符替换成空格,再用split()分隔成字符串数组,统计数组中包含字母的字符串的数目即为该行字符的单词数,循环该流程得出整个源文件的单词数。

 public void countWord(String filePath) throws IOException {
     int word=0;
     BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
     String str="";
     while(null!=(str=br.readLine())){
         str=str.replaceAll("[^A-Za-z'_-]"," ");   //将不是字母、单引号、下划线、连接符的字符替换成空格
         for(String s:str.split(" "))   //用空格分隔字符串
             if(Pattern.matches(".*[A-Za-z]+.*",s)) word++;  //字符串包含字母,就算是单词
     }
     br.close();
     System.out.println("单词数:"+word);
 }

  统计代码行、空行、注释行:getCount()

    filePath:文件路径

    用BufferedReader中的readLine()方法读取每行字符并用replaceAll()方法,将非字母、斜杠(/)、星号(*)的字符都换成空字符,再存入字符串数组中。遍历字符串数组判断归类为代码行、空行、注释行:空字符串即为空行;以双斜杠(//)开头,或(/*)开头(*/)结尾之间的字符串都为注释行;剩下的就是代码行了。

 public void getCount(String filePath) throws IOException {
     int codeLine=0,blankLine=0,commentLine=0;
     BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gb2312"));
     String str="";
     List<String> strs=new ArrayList<String>();
     boolean sign=false;
     while(null!=(str=br.readLine()))
         strs.add(str.replaceAll("[^A-Za-z/*]",""));
     for(int i=0;i<strs.size();i++){
         //空行
         if(strs.get(i).equals("")&&sign==false) blankLine++;
         //单行注释
         else if(strs.get(i).startsWith("//")&&sign==false) commentLine++;
         //多行注释
         else if(strs.get(i).startsWith("/*")||sign==true){
             commentLine++;
             sign=true;
         } else if(strs.get(i).endsWith("*/")&&sign==true){
             commentLine++;
             sign=false;
         }
         //代码行
         else codeLine++;
     }
     System.out.println("代码行:"+codeLine);
     System.out.println("空行:"+blankLine);
     System.out.println("注释行:"+commentLine);
     br.close();
 }

  递归获取目录下符合条件的文件

    file:以文件夹路径实例化的File实例

    paths:用于存文件路径的字符串数组

    flag:要获取的文件的格式

    返回结果:存有获取文件的路径的字符串数组

    遍历file通过listFiles()方法提取出的File数组,用path接收File数组每个File元素的路径。判断路径是否以文件格式flag结尾:是就加入字符串数组paths;否则就判断路径是否是目录路径,是就通过递归执行该方法。

 public List<String> getFiles(File file,List<String> paths,String flag) {
     File[] files=file.listFiles();
     if(null==files) return paths;
     for(File f:files){
         String path=f.getPath();
         if(path.endsWith(flag)) paths.add(path);
         if(f.isDirectory()) getFiles(f,paths,flag);
     }
     return paths;
 }

测试运行

  a.java为空文件

小白のjava实现wc.exe功能

  a.java为一个源文件

                a.java1 /*******************************************************
     Hello World
 *******************************************************/
 public void main(String[] args) {

     //HelloWorld.java

     System.out.println("HelloWorld");//HelloWorld.java
 }

小白のjava实现wc.exe功能

  查找D盘下所有以.java结尾的文件

小白のjava实现wc.exe功能

项目小结

  这是我第一次这么系统地完成一个项目。以前都是读完题目要求就直接敲代码,并没有去进行详细地分析,也没有计时。而现在能清楚地看到自己做一个项目所花的时间要比自己预估的时间要长,这点就必须改进,而且要学会更好地判断预估自己的能力。

  而在测试过程中发现在递归查找文件的算法耗时较多,不过目前没有较好的解决方案,期待日后能得以解决。

----------码场小白,求轻喷T T----------

小白のjava实现wc.exe功能的更多相关文章

  1. JAVA实现WC&period;exe功能

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

  2. 软件工程:Java实现WC&period;exe基本功能

    项目相关要求 GitHub地址:https://github.com/3216004716/WC 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处 ...

  3. 用c语言基本实现wc&period;exe功能

    网址:https://github.com/3216005214/wc.exe wc项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿 ...

  4. java实现wc&period;exe

    Github地址:https://github.com/ztz1998/wc/tree/master 项目相关要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功 ...

  5. 软工作业No&period;1。Java实现WC&period;exe

    网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...

  6. Java 实现 WC&period;exe

    Github:https://github.com/YJOED/Code/tree/master/WC/src 一.题目:实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他 ...

  7. Java实现WC基本功能

    GitHub仓库:https://github.com/douyazai/WCbase 一.WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...

  8. 软工作业1—java实现wc&period;exe

    github项目地址 https://github.com/liyizhu/wc.exe WC 项目要求 基本功能列表: wc.exe -c file.c     //返回文件 file.c 的字符数 ...

  9. Java实现wc部分功能

    GitHub仓库:https://github.com/TaoTaoLv1/WcProject 一.开发前PSP表格预估* PSP2.1 Personal Software Process Stage ...

随机推荐

  1. C&num;解决验证码问题

    string ss = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";            R ...

  2. C&num;中常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度   常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...

  3. java 写文本文件

    code 1:将特定String写入特定文件,不覆盖. import java.io.*; import java.util.*; public class OutputLog { public st ...

  4. MySQL索引详解

    导读:大家都知道,一个MySQL数据库能够储存大量的数据,如果要查找那一个数据,就得费好大劲从一大堆的数据中找到,即费时间又费力气,这时,索引的出现就大大减轻了数据库管理员的工作.本文介绍了数据库索引 ...

  5. CentOS搭建GIT服务器【二】-HTTP源码访问及smart http协议

    搭建完git之后,我们希望可以在线看见源码,以及使用http协议上传下载源码. 安装gitweb.httpd: yum install gitweb yum install httpd gitweb默 ...

  6. NSdate 时间格式

    NSdate 时间格式 NSTimeInterval 时间间隔 基本单位 秒 NSDateFormatter 时间格式器 用于日期对象的格式化或字符串解析为日期对象 日期格式如下: y  年 M  年 ...

  7. 搜索&lpar;DLX&rpar;:HOJ 1017 - Exact cover

    1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 6751 Solved: 3519 ...

  8. MySQL replace into 说明(insert into 增强版)

    MySQL replace into 说明(insert into 增强版) 在插入数据到一个表时,通常是这种情况:1. 先推断数据是否存在: 2. 假设不存在,则插入:3.假设存在,则更新. 在 S ...

  9. 以太坊的crypto模块--以太坊源码学习

    以太坊的crypto模块 该模块分为两个部分一个是实现sha3,一个是实现secp256k1(这也是比特币中使用的签名算法). 需要说明的是secp256k1有两种实现方式,一种是依赖libsecp2 ...

  10. Uva - 514 - Rails

    C是一个栈,每次先检查A的第一个元素是否满足,如果满足,直接进入B:再检查C中栈顶元素是否满足,如果满足,出栈进入B:前两步都不满足将A放入C栈中.循环到B满或者A,C中都不满足条件并且A空,第一种情 ...