项目地址:https://github.com/yogurt1998/WordCount

要求

  • 基本要求

    • -c 统计文件字符数(实现)
    • -w 统计文件单词数(实现)
    • -l 统计文件行数(实现)
  • 扩展功能
    • 递归处理目录下符合条件的文件。(实现)
    • 返回更复杂的数据(代码行 / 空行 / 注释行)(实现)
  • 高级功能
    • 实现图形化界面(未实现)

PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40 65
· Estimate · 估计这个任务需要多少时间 30 45
Development 开发 450 600
· Analysis · 需求分析 (包括学习新技术) 60 90
· Design Spec · 生成设计文档 60 60
· Design Review · 设计复审 (和同事审核设计文档) 30 30
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
· Design · 具体设计 30 30
· Coding · 具体编码 150 150
· Code Review · 代码复审 150 150
· Test · 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 100 100
· Test Report · 测试报告 60 60
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 1310 1530

设计

main.java

主函数:一个循环获取输入命令并分隔出指令和文件路径。

统计函数:通过IO流获取文件内容并统计字符数、行数、单词数等。

文件判断函数:判断是否为文件夹或者文件以实现递归处理功能

AFile.java

代表着字符数等六个属性。

代码

main()函数

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub do {
String filename = null;
String bString = null;
System.out.println("请输入命令(格式:[parameter] [file_name])"); while (true) {
Scanner scanner = new Scanner(System.in); // 获取键盘输入 if (scanner.hasNext()) {
bString = scanner.next();
} if (bString.equals("-c") || bString.equals("-w")
|| bString.equals("-l") || bString.equals("-s")
|| bString.equals("-a")) {
if (scanner.hasNextLine()) {
filename = scanner.next();
}
break;
} else {
System.out.println("错误!请重新输入!");
}
} String filepath = "D:\\test\\" + filename; // 在绝对路径中打开 File file = new File(filepath);
if (!file.exists()) {
System.out.println("文件不存在");
continue;
} AFile aFile = new AFile();
aFile = findFiles(filepath); if (bString.equals("-c"))
System.out.println("字符数为" + aFile.charNumb);
else if (bString.equals("-w"))
System.out.println("单词数为" + aFile.wordNumb);
else if (bString.equals("-l"))
System.out.println("行数为" + aFile.lineNumb);
else if (bString.equals("-a"))
System.out.println("空行数为:" + aFile.empleLine
+ " 代码行数为:" + aFile.codeLine + " 注释行数为:" + aFile.nodeLine); } while(true); }

findFiles()函数:通过递归处理文件

private static AFile findFiles(String file_path) {

		File file = new File(file_path);
AFile aFile = new AFile(); if (file.isDirectory()) { // 判断为文件夹
File[] files = file.listFiles(); // 获取文件列表
if (files == null) {
System.err.println("找不到");
} else if (files.length == 0) {
System.out.println("目录为空");
} else {
for (File f : files) { // 循环处理文件
if (f.isDirectory()) // 判断为文件夹
findFiles(f.getPath());
else if (f.isFile()) { // 判断为文件
System.out.println("文件名为:" + f.getName() + "\n字符数为" + getCount(f.getPath()).charNumb +
"\n单词数为" + getCount(f.getPath()).wordNumb +
"\n行数为" + getCount(f.getPath()).lineNumb +
"\n空行数为:" + getCount(f.getPath()).empleLine +
"\n代码行数为:" + getCount(f.getPath()).codeLine +
"\n注释行数为:" + getCount(f.getPath()).nodeLine);
}
}
}
} else if (file.isFile() && file.exists()) { // 判断为文件
aFile = getCount(file.getPath());
} return aFile;
}

getCount()函数:通过BufferedReader获取文件内容并判断

private static AFile getCount(String filepath) {
AFile aFile = new AFile();
try {
BufferedReader brin = new BufferedReader(new FileReader(filepath));
String s;
int state = 0; // 判断是否在单词内 // 使用正则表达式判断注释行
String regxNodeBegin = "(\\S?)\\s*/\\*.*";
String regxNodeEnd = "(.*\\*/\\s*)\\S?";
String regxNode = "(\\s*)(\\S?)(//+).*"; while ((s = brin.readLine()) != null) {
++ aFile.lineNumb;
int countLetter = 0; // 判断非空格字符数量 for (int i = 0; i < s.length(); i++) {
++aFile.charNumb;
Character c = s.charAt(i);
++countLetter;
if (c == ' ' || c == '\n' || c == '\t') {
state = 0;
--countLetter;
}
else if (state == 0) {
state = 1;
++aFile.wordNumb;
}
} if (s.matches(regxNodeBegin) || s.matches(regxNodeEnd)
|| s.matches(regxNode))
++aFile.nodeLine;
else if (countLetter > 1) // 如果非空格字符数多于1
++aFile.codeLine;
else
++aFile.empleLine;
}
} catch (IOException e) {
// TODO: handle exception
System.out.println(e.getMessage());
} return aFile;
}

测试运行

测试文件:

测试结果:

总结

  1. 根据在软件工程课堂上得到的知识进行分析,但没有细心分析导致递归功能一开始写错。
  2. 程序的思路一开始并不是很清晰导致后面很多修改以及代码繁杂。
  3. 学习了Git和GitHub的使用以及exe4j的使用。
  4. 对程序设计很不熟悉需要更多的练习。

软件工程作业 - 实现WC功能(java)的更多相关文章

  1. 软件工程—WC功能实现 (JAVA)

    软件工程-WC功能实现(JAVA) Github项目地址:https://github.com/Ousyoung/wc 项目要求 ​ wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和 ...

  2. 软件工程作业 - word count

    (编程和软件工程作业系列) 实践最简单的项目:WC 实践是理论的基础和验证标准,希望读者贯彻“做中学”的思想,动手实现下面的项目,并和别人的成绩相比较,分析产生差距的原因. 1. 实现一个简单而完整的 ...

  3. Implementation of WC in JAVA

    Implementation of WC in JAVA github地址 相关要求 基本功能 -c [文件名] 返回文件的字符数 (实现) -w [文件名] 返回文件的词的数目 (实现) -l [文 ...

  4. 实现wc部分功能 java

    GitHub地址:https://github.com/carlylewen/ruangong 相关要求 基本功能 wc.exe -c file.c     //返回文件 file.c 的字符数(实现 ...

  5. 个人小项目——Java实现WC功能

    这个小项目用了两种方法解决了该功能的实现. 1.两种方法的功能和具体实现 代码可以成功运行,但是有一些情况考虑不完整,一种方法用了FileOutputStream输出流,为了解决空格无法统计问题,对文 ...

  6. java实现wc功能

    github项目地址:https://github.com/3216004717/ruanjiangongcheng.git 项目相关要求 基本要求 wc.exe -c file.c //返回文件 f ...

  7. 算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)

    目录 1 填算式 2 提取子串 3 机器人行走 4 地址格式转换 5 排日程   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 填算式 [结果填空] (满分11分) 看这个算式: ☆☆☆ + ☆☆ ...

  8. 软件设计模式之代理模式(JAVA)

    貌似停笔了近半个月了,实在不该啊,新的一年,时刻让自己归零. Back To Zero,就从这篇文章拉开今年的序幕吧. 这篇文章准备介绍下有关代理模式的基本概念和静态代理.动态代理的优缺点及使用方法( ...

  9. 软件工程作业——Word Counter

    github地址 https://github.com/Pryriat/Word_Counter 项目说明 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...

随机推荐

  1. Numpy随机数

    Numpy随机数 np.random随机数子库 1: 基本函数 .rand(d0,d1,..dn):创建d0-dn维度的随机数数组,浮点数,范围从0-1,均匀分布 .randn(d0,d1,..dn) ...

  2. php获取微信用户信息(没测试过)

    <?php /** * 通过$appid.$appsecret获得基础支持的接口唯一凭证access_token,返回值为array类型 */ function get_access_token ...

  3. innerText 与textContent区别

    两者都是可以过滤html元素 innerText 获取内容 换行会有L类似特殊符号 textContent 没有

  4. java.lang.IllegalArgumentException: Service not registered

    java.lang.IllegalArgumentException: Service not registered 首先检查一下,Service是否在AndroidManifest文件中注册.格式如 ...

  5. React Native 首次加载白屏优化

    RN首次加载都会有个白屏过程,一般都会有500ms+的白屏时间,原生页面开发同样的页面会能够快速显示而在RN页面中有个明显的等待过程,这个会影响用户体验. 1.使用过渡页面 简单处理可以在白屏过程中加 ...

  6. OC 线程操作 - GCD快速迭代

    - (void)forDemo{ //全都是在主线程操作的 ; i<; i++) { NSLog(@"--%@", [NSThread currentThread]); } ...

  7. Linux SSH基于密钥交换的自动登陆原理简介及配置说明

    一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...

  8. 20-java 对象链表空没空呢

    写了一个 对象链表,往里面add了一些对象,最后我想看下链表是否为空,用  == null  为假,也看不出, 看下长度? 好吧, size() = 1: 打印  null ,  那到底是不是空 啊, ...

  9. 转 git push 提示 Everything up-to-date

    git 还没有分支,需要指定一个($ git remote -v),就可以push了 第一步:$ git remote -v 第二步:$ git branch 转载链接: http://blog.cs ...

  10. vue2.0 element学习

    1,bootstrap和vue2.0结合使用 vue文件搭建好后,引入jquery和bootstrap 我采用的方式为外部引用 在main.js内部直接导入 用vue-cli直接安装jquery和bo ...