Github:https://github.com/YJOED/Code/tree/master/WC/src

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

  • 程序处理用户需求的模式为:wc.exe [parameter] [file_name]
  • 基本功能列表:
  1. wc.exe -c file.c     //返回文件 file.c 的字符数。(实现)
  2. wc.exe -w file.c    //返回文件 file.c 的词的数目 。(实现)
  3. wc.exe -l file.c      //返回文件 file.c 的行数。(实现)
  • 扩展功能:
  1. -s   递归处理目录下符合条件的文件。(实现)
  2. -a   返回更复杂的数据(代码行 / 空行 / 注释行)。(实现)
  • 高级功能:
  1. -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。(未实现)

二、设计思路

  利用Java里的IO流对文件内容进行读取,通过创建Scanner类的实例从键盘获取操作命令和目的文件,使用了缓冲流的readline()方法对文件按行读取,使用String类的split()方法、matches()方法对每一行的的字符数、词数、行数进行统计,判断每一行是否是空行、注释行或代码行,使用了IO中的FileFilter()接口以及File类中的listFiles(FileFilter f)方法实现对指定路径下的符合条件的文件进行过滤操作。将基本功能"-l"、“-w”、“-c”、“-a”封装在一个方法里Operation()中,将拓展功能“-a”的实现封装在方法SpecialLine()中,将拓展功能“-s”的实现封装在HandleFile()中,根据输入的命令,调用不同的方法,方法与方法之间也有调用关系。

  • 功能模块:

  基本功能:Operation(String[] sip) {…}

  统计特殊行:SpecialLine(BufferedReader br) {…}

  处理多个文件:HandleFile(String[] file) {…}

  文件过滤器:class MyFileFilter implements FileFilter{…}

  • 流程图:

三、代码分析

  1. 主方法:获取命令和操作文件的路径、名称,根据输入的命令格式调用相应的方法进行操作:
 import java.io.*;
import java.util.*;
import java.lang.String; public class WC {
public static void main(String[] args)throws Exception {
Scanner input = new Scanner(System.in);
while (true) {
System.out.println("please input '[order] [filename]':");
System.out.print("wc.exe ");
String ip[] = input.nextLine().split(" ");
if (ip.length==2) {
Operation(ip);
}else if(ip.length==3 && "-s".equals(ip[0])){
HandleFile(ip);
}else System.out.println("Error");
}
}

  2.基本功能——统计字符数、词数、行数,命令与文件以字符串数组的形式作为参数传入该方法,判断输入的命令,执行相应的操作,如果命令为“-a”,调用另一方法统计特殊行:

     public static void Operation(String[] sip)throws Exception{
String s;
int linecount = 0, wordcount = 0, charcount = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sip[1])));
if ("-l".equals(sip[0])) { // Line count
while ((s = br.readLine()) != null) {
linecount++;
}
System.out.println("Line count:" + linecount);
} else if ("-c".equals(sip[0])) { // Char count
while ((s = br.readLine()) != null) {
charcount = charcount + s.length();
}
System.out.println("Char count:" + charcount);
} else if ("-w".equals(sip[0])) { // Word count
while ((s = br.readLine()) != null) {
String[] sa = s.split("\\s+|\\(|\\)|,|\\.|\\:|\\{|\\}|\\-|\\+|;|\\?|\\/|\\\\|/");
wordcount = wordcount + sa.length;
}
System.out.println("Word count:" + wordcount);
} else if("-a".equals(sip[0])){
SpecialLine(br);
}
br.close();
}

  3.统计特殊行:第一次实现时忽略了注释行还可以使用“/*……*/”表示,添加入对应的正则表达式并查找资料后使用了一个标记targer来统计这种情况下的注释行数;

     public static void SpecialLine(BufferedReader br)throws Exception {
String s;
String REGEX_1 = "\\s*(\\{|\\})?//.*";
String REGEX_2 = "(\\{|\\})?\\s*";
String REGEX_3 = "\\s*/\\*.*";
String REGEX_4 = ".*\\*/";
boolean targer = false;
int blankline = 0, commentline = 0, codeline = 0;
while ((s = br.readLine()) != null) {
if (s.matches(REGEX_1)) {
commentline++;
}else if (s.matches(REGEX_2)) {
blankline++;
}else if(s.matches(REGEX_3)&&!s.matches(REGEX_4)){
commentline++;
targer = true;
}else if(targer==true){
commentline++;
if(s.matches(REGEX_4)){
targer=false;
}
}else codeline++;
}
System.out.println("Blank Line count:"+blankline);
System.out.println("Comment Line count:"+ commentline);
System.out.println("Code Line count:"+ codeline);
}

  4.递归处理目录下符合条件的文件:在该命令中需要对文件进行过滤,只取出那些我们需要操作的文件即可,所以使用了FileFilter接口实现文件的过滤,使用substring()和lastIndexOf()来将模糊输入的文件类型和文件目录分割开。打印文件名并输出统计情况:

     public static void HandleFile(String[] file)throws Exception{
String path=null,filetype=null;
String[] sip={file[1],null};
if(file.length>2){
filetype = file[2].substring(file[2].lastIndexOf("."));
path = file[2].substring(0,file[2].lastIndexOf("\\"));
}
File f = new File(path);
MyFileFilter mff = new MyFileFilter(filetype);
File[] files = f.listFiles(mff);
for(int i=0;i<files.length;i++){
sip[1]=files[i].getPath();
System.out.println("File Name: "+files[i].getName());
Operation(sip);
}
}

  5.文件过滤器接口的实现,重写了该接口的accept()方法:在accept()方法中,对符合条件的文件返回TRUE,否则返回FALSE:

 class MyFileFilter implements FileFilter{
String str;
public MyFileFilter(String _str){
str = _str;
}
public boolean accept(File pathname){
//if(pathname.isDirectory()) return true;
String f = pathname.getName();
if(f.endsWith(str)) return true;
return false;
}
}

四、测试结果

测试用文件:

测试结果:

1.命令“-s”、”-a“:

2.命令“-w”:

3.命令“-c”:

4.命令“-l”:

五、PSP2.1表格

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

20

20

· Estimate

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

60

60

Development

开发

180

240

· Analysis

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

20

20

· Design Spec

· 生成设计文档

30

30

· Design Review

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

30

30

· Coding Standard

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

10

10

· Design

· 具体设计

40

60

· Coding

· 具体编码

180

240

· Code Review

· 代码复审

25

30

· Test

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

60

60

Reporting

报告

30

30

· Test Report

· 测试报告

20

20

· Size Measurement

· 计算工作量

20

30

· Postmortem & Process Improvement Plan

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

20

25

合计

 

745

955

六、项目小结

  通过这一次的程序练习,不仅对软件工程的思想有了更深的认识,在动手实现之前通过估计时间并与实际完成所需时间进行对比,还让我意识到自己其实对实现这样一个小程序还不够熟练,对编程的练习还是太少,需要加强练习,提高技巧,提升能力,以减短不必要的时间的消耗和浪费。

Java 实现 WC.exe的更多相关文章

  1. 小白のjava实现wc.exe功能

    GitHub地址 项目完成情况 基本功能列表(已实现) wc.exe -c file.c     //返回文件 file.c 的字符数 wc.exe -w file.c    //返回文件 file. ...

  2. java实现wc.exe

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

  3. 软工作业No.1。Java实现WC.exe

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

  4. JAVA实现WC.exe功能

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

  5. 软件工程:Java实现WC.exe基本功能

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

  6. 软工作业1—java实现wc.exe

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

  7. 软件工程实践一 —— java之wc.exe

    SoftwareEngineering-wc github项目地址:https://github.com/CuiLam/SoftwareEngineering-wc   项目相关要求 实现一个统计程序 ...

  8. 软工作业1:wc.exe项目开发(java)

    Github地址:https://github.com/Zzhaomin/learngit 项目相关要求 : wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...

  9. WC.exe(Java实现)

    一.GitHub项目地址:https://github.com/nullcjm/mypage 二.项目相关要求: wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写 ...

随机推荐

  1. PHP中composer的安装和使用

    $ composer ______ / ____/___  ____ ___  ____  ____  ________  _____ / /   / __ \/ __ `__ \/ __ \/ __ ...

  2. PHP编译安装系列

    徐亮伟, 江湖人称标杆徐.多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作.擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作. 个人博客"徐亮伟架构师之路&quo ...

  3. Linux下编译、安装并启动apache

    安装步骤如下: 1.  首先去http://httpd.apache.org/download.cgi上下载需要的apache源码,然后存放至/usr/local/src下[此源码存放路径可任意指定] ...

  4. JAVASCRIPT数据类型(值类型-引用类型-类型总览)

    值类型:也称为原始数据或原始值(primitive value). 这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最 ...

  5. tornado 之 异步非阻塞

    异步非阻塞 1.基本使用 装饰器 + Future 从而实现Tornado的异步非阻塞 import tornado.web import tornado.ioloop from tornado im ...

  6. css style study

    <img style="float:none;display:block;margin:0px auto" src="images/aa.jpg"> ...

  7. totoise svn误将桌面作为checkout路径,界面一堆?

    工作中由于错误操作,totoise svn检出文件时,直接选择检出路径为桌面,这样导致界面一大堆“?”:看起来比较烦,上网查找处理方案: 其中一个最简单的方法是: 第一步:新建txt文件: 第二步:输 ...

  8. Spring Session 学习记录1

    先写些废话 新公司项目是有用到redis,之前老公司使用的缓存框架是ehcache.我redis并不熟悉.看过介绍以后知道是个nosql..既然是个数据库,那我想操作方法和jdbc操作关系数据库应该差 ...

  9. 【转】arm和x86的区别

    来自: https://blog.csdn.net/u012513972/article/details/78349192/ 信不信,随便逮住一个人问他知不知道CPU,我想他的答案一定会是肯定的,但是 ...

  10. iOS多线程编程之NSOperation和NSOperationQueue的使用

    前一篇 <iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是 ...