这个作业属于哪个课程 | 软件工程实践2022年春-F班 |
---|---|
这个作业要求在哪里 | 软件工程实践第二次作业----个人实战 |
这个作业的目标 | 完成对冬奥会的信息爬取并根据作业要求输出 |
其他参考文献 | CSDN上的多篇文章··· |
目录
GitCode项目地址
221900121阮鸿林/PersonalProject-Java
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1260 | 1790 |
• Estimate | • 估计这个任务需要多少时间 | 1260 | 1790 |
Development | 开发 | 1160 | 1630 |
• Analysis | • 需求分析 (包括学习新技术) | 200 | 300 |
• Design Spec | • 生成设计文档 | 90 | 100 |
• Design Review | • 设计复审 | 60 | 50 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 60 |
• Design | • 具体设计 | 30 | 50 |
• Coding | • 具体编码 | 600 | 540 |
• Code Review | • 代码复审 | 30 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 150 |
Reporting | 报告 | 100 | 160 |
• Test Repor | • 测试报告 | 30 | 40 |
• Size Measurement | • 计算工作量 | 10 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 100 |
合计 | 1260 | 1790 |
解题思路描述
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程序,下意识觉得很难,仔细观察,并查阅了资料之后发现其实难度适中,经过一段时间的编写可以写完这个程序。所以人还是得不断跳出自己的舒适圈才能让自己变得更优秀。同时在写完之后经过和同学的讨论,我也更新了很多代码的内容,所以我们需要更多地交流才能更好地改进自己的技术,一味地埋头苦干直接提交作业是不可取的。