软件工程第二次作业--文件读取

222100312李冬铭 2024-03-01 23:05:15
这个作业属于哪个课程福州大学-202302软件工程实践
这个作业要求在哪里 软件工程第二次作业--文件读取
这个作业的目标完成对世界游泳锦标赛跳水项目数据的爬取,并编写一个处理相关数据的程序
其他参考文献构建之法、单元测试教程、Java开发手册、菜鸟教程

目录

  • 1,Gitcode项目地址
  • 2,PSP表格
  • 3,解题思路描述
  • 3.1,数据获取
  • 3.2数据解析
  • 3.3数据保存
  • 4,接口设计和实现过程
  • 4.1接口设计
  • 4.2实现过程
  • 5,关键代码展示
  • 6,性能改进
  • 7,单元测试
  • 8,异常处理
  • 9,心得体会

1,Gitcode项目地址

仓库地址

2,PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划2030
• Estimate• 估计这个任务需要多少时间2020
Development开发12001400
• Analysis• 需求分析 (包括学习新技术)180200
• Design Spec• 生成设计文档3020
• Design Review• 设计复审3040
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)2030
• Design• 具体设计6060
• Coding• 具体编码480600
• Code Review• 代码复审3060
• Test• 测试(自我测试,修改代码,提交修改)250300
Reporting报告150180
• Test Repor• 测试报告4060
• Size Measurement• 计算工作量2530
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划6060
合计23803090

3,解题思路描述

3.1,数据获取

打开网页,然后打开web网页开发者工具,点击网络一栏来监听数据发送请求。

img

然后点击对应的比赛项目,获取相关数据,然后点击fetch/XHR筛选出json文件。

img

获取运动员信息也用同样的方法

img

3.2数据解析

可以看到题目要求的数据全部在json文件中,因此想要拿到数据就要解析json文件

img

img

解析json文件就用java中的工具包,我选择的是阿里巴巴的fastjson工具包,想要使用该工具包就要在pom文件中引入相应的依赖。

img

然后可以用工具包里的getJSONObject方法和getJSONArray方法逐步剥离json文件,从而获取想要的数据

3.3数据保存

得到想要的数据后,就要将数据保存到合适的数据结构中,从而利于将数据写入文件并展示出来。我使用对象封装的方法将json解析的数据保存,一个运动员就对应一个对象,而运动员的成绩、姓名、性别就和对象中的属性一一对应。

用于保存运动员基本信息的运动员类

img

用于保存每个运动员比赛结果的类:

img

4,接口设计和实现过程

4.1接口设计

我将所有关键函数封装到一个接口中,作为本次项目的核心代码,然后将输出全部选手信息、输出决赛结果、输出比赛详细结果这三个功能分别封装到接口的三个函数中。

接口结构展示:

img

4.2实现过程

这三个核心函数的实现思路大致相同:

  • 先通过传递的参数拼接出json文件的路径,然后打开对应的json文件
  • 然后将json文件转化成字符串利于读取其中的数据
  • 利用JSONObject.parse(json)将字符串转化成json对象
  • 然后运用getJSONObject方法和getJSONArray方法将数据解析出来
  • 将解析出来的数据保存到对象列表中
  • 将列表中的对象都转化成字符串,用输出函数进行输出

5,关键代码展示

解析json数据代码:

img

将对象转化为字符串代码:

img

处理input命令的代码:

img

6,性能改进

经过测试,本人发现项目主要耗时在解析json、将数据写入文件上,将json文件转化为字符串耗费了大量时间,因此从以下几个方面改进了解析json文件和文件IO的函数:

  • 使用 BufferedReader:使用 BufferedReader 来替代 InputStreamReader,提高读取文件的效率。
  • 批量读取数据:不必每次读取一个字符,一次读取多个字符,然后再转换成字符串。
  • 资源关闭:使用 try-with-resources 语句来确保 reader 在使用完毕后被正确关闭。
  • 提前设置 StringBuilder 的容量:知道大致的 JSON 字符串长度,可以提前设置 StringBuilder 的容量,避免动态扩容带来的性能开销。
  • 减少写入的次数,将要写入的数据先保存在一个字符串中,然后再一次性写入。

修改前函数:

img


img

修改后函数:

img


img

修改前耗时:

img

修改后耗时:

img

7,单元测试

测试命令行输入的各种情况,以下是部分测试函数:

img

测试结果:

img

覆盖率:

img

测试核心函数输出选手信息和输出比赛信息,以下是部分测试函数:

img

测试结果:

img

覆盖率:

img


img

测试输出选手详细信息的核心函数,以下是部分测试函数:

img

测试结果:

img

覆盖率:

img

下载squaretest进行自动测试:

img

选择要测试的函数:

img

8,异常处理

处理命令行参数异常情况,确保无参数时也可以运行,同时当文件名错误时也会抛出异常。

img

当文件中的项目名称输入错误或格式输入错误时及时处理,输出”N/A“

img

当文件中的命令不符合规范时及时处理,输出”Error“

img

json文件打开失败要及时反馈

img

9,心得体会

在完成这次项目的过程中,主要学习了解析json文件的方法,知晓了如何用maven导入工具包来帮助开发,同时也掌握了爬取网站上部分数据的方法。在实际开发过程中遇到了诸如无法打开文件、单元测试异常等问题,在解决问题的过程中也让我的代码水平得到了提升,查阅资料的能力也得到了加强。我也将在这个项目的基础上继续努力,挑战自我。

...全文
87 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

122

社区成员

发帖
与我相关
我的任务
社区描述
FZU-SE
软件工程 高校
社区管理员
  • LinQF39
  • 助教-吴可仪
  • 一杯时间
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧