个人项目(wordCount java)
WordCount.exe(java)
github项目地址:https://github.com/ydkxiu/wordCount
一、题目描述
- 实现一个简单而完整的软件工具(源程序特征统计程序)
- 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
- 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
二、解题思路描述
寒假在家简单学了下java,还没有实践过.这次作业用到了面向对象的思想,就想到用java来实现,对字符串的处理也简单一些.
三、设计实现过程
主要用了一个主类一个方法类来实现,方法全部存放在方法类中.
四、代码说明
- 统计字符数目
public static void charNum(String inPath) {
int num=0;
try {
FileReader fr = new FileReader(inPath);
BufferedReader br = new BufferedReader(fr);
int a=0;
while((a = br.read()) !=-1) {
if(a!='\n'&&a!='\r') {
num++;
}
}//不是回车或回车换行就算字符
br.close();
fr.close();//关闭流
System.out.println("该文件字符数为"+num);
}catch (IOException e) {
System.out.println("该文件不存在,请重新输入!");
}
}
- 统计行数
public static void lineNum(String inPath) {
String line= null;
int lineNum=0;
try {
FileReader fr = new FileReader(inPath);
BufferedReader br = new BufferedReader(fr);
while((line = br.readLine())!=null) {
lineNum++;//读的到就算一行
}
br.close();
fr.close();
System.out.println("该文件行数为"+lineNum);
} catch (IOException e) {
System.out.println("该文件不存在,请重新输入!");
}
}
- 统计单词数
public static void wordNum(String inPath) {
String line= "";
int wordNum=0;
try {
FileReader fr = new FileReader(inPath);
BufferedReader br = new BufferedReader(fr);
while((line = br.readLine())!=null) {
for(int i=0;i<line.length();i++) {
char c=line.charAt(i);
if(i==line.length()-1 && ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) ){
wordNum++;//如果是该行最后一个字符且是英文字母则单词数+1
}
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) {
continue;//还是英文字母则继续
}else {
wordNum++;
}
}
}
br.close();
fr.close();
System.out.println("该文件单词数为"+wordNum);
} catch (IOException e) {
System.out.println("该文件不存在,请重新输入!");
}
}
- 返回更复杂的数据(代码行 / 空行 / 注释行)
public static void complexLines(String inPath) {
int blankLines=0;
int commentLines=0;
int codeLines=0;
String line = "";
int flag= 0;
try {
FileReader fr = new FileReader(inPath);
BufferedReader br = new BufferedReader(fr);
while ((line = br.readLine()) != null) {
line = line.trim();
if(flag==1) {
if(line.endsWith("*/")) {
flag=0;
}else {
commentLines++;
}
}else {
if(line.startsWith("/*")){
commentLines++;
}
else if(line.startsWith("//")||line.startsWith("}//")){
commentLines++;
}
else if(line.equals("")) {
blankLines++;
}
else {
codeLines++;
}
}
}
br.close();
fr.close();
System.out.println("该文件的注释行为"+commentLines);
System.out.println("该文件的空白行为"+blankLines);
System.out.println("该文件的代码行为"+codeLines);
} catch (IOException e) {
e.printStackTrace();
}
}
- 递归处理
public static void recursion(File file) {
if(file.isFile()) {
System.out.println(file.getAbsolutePath());
Method.charNum(file.getAbsolutePath());
Method.lineNum(file.getAbsolutePath());
Method.wordNum(file.getAbsolutePath());
}else {
File [] ff=file.listFiles();
for(File fs:ff) {
recursion(fs);
}//递归处理
}
}
- 主函数
public static void main(String[] args){
int flag=1;
Scanner sc = new Scanner(System.in);
String inStr="aaa";
File file=null;
while(flag==1){
System.out.println("请输入命令 ");
if(sc.hasNextLine()){
inStr = sc.nextLine();
}
String[] path = inStr.split(" ");
if(path.length>1) {
file = new File(path[1]);
}
switch(path[0])
{
case"-c":
Method.charNum(path[1]);
break;
case"-w":
Method.wordNum(path[1]);
break;
case"-l":
Method.lineNum(path[1]);
break;
case"-s":
Method.recursion(file);
break;
case"-e":
flag=0;
break;
case"-a":
Method.complexLines(path[1]);
break;
default:
System.out.println("格式错误,请重新输入!");
}
}
}
五、测试运行
- 只有一个字符的文件
- 只有一行的文件
- 只有一个单词的文件
- 复杂的文件
- 递归调用
六、PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 405 | 635 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 120 |
· Design Spec | · 生成设计文档 | 10 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 40 | 40 |
· Coding | · 具体编码 | 210 | 240 |
· Code Review | · 代码复审 | 40 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 40 | 180 |
Reporting | 报告 | 50 | 60 |
· Test Report | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 495 | 735 |
七、项目总结
刚开始psp预估时以为不用那么久,但实际操作起来却是阻碍一个接一个,自己对java的使用还是十分的生疏,String的方法调用完全不熟练,查了才知道有这么方便快捷的函数.
同时思路也有卡壳,一时间想不到注释行该怎么计算.第一次使用exe4j转jar为exe,出现了相当多的问题,所以在测试和学习新知识方面花了十分多的时间,在打开exe的时候,
一打开就报错,eclipse可以正常使用.我最开始使用的是bufferedreader读取system.in来获取用户输入,结果报空指针异常,多次检查还是如此,不得已换为scanner读取,
发现仍然是报noline错误,最后发现exe4j转exe的时候发现应该点击console 而不是gui才解决问题.同时也简单了解如何使用github管理项目和用markdown编辑博客,
自己还有很多不足,还需要努力努力再努力.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本