软件工程实践第二次作业----个人实战

这个作业属于哪个课程软件工程实践2022年春-F班
这个作业要求在哪里软件工程实践第二次作业----个人实战
这个作业的目标完成对冬奥会的信息爬取并根据作业要求输出
其他参考文献CSDN上的多篇文章···


GitCode项目地址

221900121阮鸿林/PersonalProject-Java
在这里插入图片描述


PSP表格

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

解题思路描述

1.爬取网站的数据

经过查找资料,从网上下载了一个爬虫程序抓取了网上的数据,把数据放入了data文件中

2.对下载的json数据寻找第三方包并学习如何解析

经过查找,下载了fastjson包,并在网上学习了fastjson如何使用

3.两个接口功能的实现

从main中给出file的路径,然后用filereader和filewriter来读取文件和写入文件,再返回String类型值给到main中。

4.主函数中读取文件并实现接口功能

通过File file = new FIle(args[index])来获得文件路径,再把路径给到各个接口的方法中,从而实现接口功能。

5.如何用命令行运行.jar文件

在网上查找资料后发现,用idea构建.jar文件,然后打开cmd界面,并在目录下新建两个txt文件,输入给定的命令来运行程序读取和输入到两个文件中。

6.在程序中如何获得文件的路径,使得能够在测试时能够运行

final String CLASS_PATH = new File(System.getProperty(“java.class.path”)).getAbsolutePath();语句能够获取.jar包的绝对路径,再通过字符串的拼接来获得data中的文件路径,保证文件的运行。

7.当读入的文件中的数据较多时,如何加速

使用HashMap<String,String>缓存存储文件数据,当再次读取到相同内容时能够直接输出到文件中,不需要再次读取。


接口设计和实现过程

接口功能分别为实现到2月20日的奖牌榜信息以及输出2月2日到2月20日其中一天的当日比赛信息。
奖牌榜信息通过MedalListOutput接口实现:main中判断读取一行信息为total时,执行该方法输出奖牌榜。通过filereader读取,然后用StringBuffer的append方法加入StringBuffer中,在用JSONArray.parse()方法给Object,再将Object强制类型转化为JSONArray。这样就可以用类似((JSONObject) obj1.get(index)).getString(“rank”)这种格式读取json文件的信息,然后用字符串拼接并返回字符串。当日比赛信息通过ScheduleOutput接口实现,实现方法类似MedalListOutput接口,但是需要在其中加入判断日期的方法来判断比赛日期,从而返回相应字符串到main。


关键代码展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


性能改进

性能改进的大致思路如下:
1、尽量重用对象
特别是String对象的使用,出现字符串连接时使用StringBuilder/StringBuffer代替BufferedWriter。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。
2、尽可能使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。
3、及时关闭流
进行I/O流操作时,要小心谨慎,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销。还有对应的异常处理也要注意,防止资源泄露。
4、使用带缓冲的输入输出流进行IO操作。带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。
5、使用缓存来存放固定的20个文件的数据,以方便在大数据读入时能够更快地输出,提高效率。
性能改进后发现比起改进前在数据量较大时甚至能够使得运行速度快百倍。如没使用缓存时,当读入文件超过10^7时,需要十几分钟,而使用过后只需要不到20秒;使用单行读取和多行拼接相比也节省了很多内存。


单元测试

1.对main方法的测试,共一百万次写入和读取:
在这里插入图片描述
在这里插入图片描述
测试通过

2.覆盖率:
在这里插入图片描述
测试数据为:
total
schedule 0215


异常处理

出现的异常大部分都可以使用catch语句抓取输出。用cmd运行时出现了中文乱码的异常,可以发现是因为txt文件的读取器使用了非utf-8编码,因此可以更换读取txt文件的软件的编码格式,也可以使用在java 后加-Dfile.encoding=utf-8的方式避免,即使用utf-8编码,使得编码统一,能够使异常不再出现。


心得体会

刚开始看这道题目,因为很久没有写过java程序,下意识觉得很难,仔细观察,并查阅了资料之后发现其实难度适中,经过一段时间的编写可以写完这个程序。所以人还是得不断跳出自己的舒适圈才能让自己变得更优秀。同时在写完之后经过和同学的讨论,我也更新了很多代码的内容,所以我们需要更多地交流才能更好地改进自己的技术,一味地埋头苦干直接提交作业是不可取的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

afocian

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值