这个作业属于哪个课程 | 2023软件工程 |
---|---|
这个作业要求在哪里 | 文件读取 |
这个作业的目标 | 完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序 |
其他参考文献 | 单元测试 |
目录:
1. Gitcode项目地址
222100219/ Project Java
2. PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
• Estimate | • 估计这个任务需要多少时间 | 15 | 15 |
Development | 开发 | 300 | 460 |
• Analysis | • 需求分析 (包括学习新技术) | 20 | 50 |
• Design Spec | • 生成设计文档 | 20 | 25 |
• Design Review | • 设计复审 | 30 | 20 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 25 | 25 |
• Design | • 具体设计 | 45 | 60 |
• Coding | • 具体编码 | 90 | 120 |
• Code Review | • 代码复审 | 40 | 50 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 100 |
Reporting | 报告 | 90 | 90 |
• Test Repor | • 测试报告 | 50 | 40 |
• Size Measurement | • 计算工作量 | 10 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 845 | 1125 |
3. 解题思路描述
3.1 读取JSON文件并解析
使用Jackson库,Jackson是一种快速、多功能且灵活的Java库,用于处理JSON数据。它可以将Java对象序列化为JSON字符串,并将JSON字符串反序列化为Java对象。
首先,我们需要在项目中导入Jackson库的依赖。用Java中的File和FileReader类读取JSON文件的内容,通过读取JSON文件的每个字符并将其附加到StringBuilder对象中来实现文件读取。最后,将StringBuilder对象转换为字符串并返回。接下来就可以使用Jackson库将其转换为字符串,使用ObjectMapper类的readValue()方法将JSON文件内容转换为Java对象。然后,使用writeValueAsString()方法将Java对象转换为JSON字符串。
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String filePath = "example.json";
try {
String jsonFileContent = JsonToStringConverter.readFileToString(filePath);
String jsonString = JsonToStringConverter.convertToJsonString(jsonFileContent);
System.out.println(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 接口设计和实现过程
4.1 主要的类
- 数据模型类:根据JSON文件的数据结构进行设计。例如选手信息,根据作业的输出要求和JSON的数据结构进行设计,类Player包含3个字段:fullname、gender和country。
- 文件对应类:根据作业给出的JSON文件,提取出各个赛事对应的命令,并用C进行存储,有利于提高程序的处理速度。
- 逻辑处理类:包含了多个逻辑处理方法,例如:JSON文件的读取与解析、TXT文件的读取与写入等。
4.2 指令实现过程(实现逻辑)
- 读取input.txt文件,初始化指令List
- 逐行读取指令,并进行判断。若是非法指令,输出Error;若指令有误,则输出N/A;若指令为players或result形式的正确指令,则进行下一步处理。
- 根据指令类型进行响应的处理。
- 重复步骤2,直到指令List为空。
- 结束进程。
5. 关键代码展示
5.1 JSON文件的读取与解析
public static String readFileToString(String filePath) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
File file = new File(filePath);
try (FileReader fileReader = new FileReader(file)) {
int character;
while ((character = fileReader.read()) != -1) {
stringBuilder.append((char) character);
}
}
return stringBuilder.toString();
}
public static String convertToJsonString(String jsonFileContent) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Object jsonObject = objectMapper.readValue(jsonFileContent, Object.class);
return objectMapper.writeValueAsString(jsonObject);
}
5.2 输出所有选手信息
//解析获取的选手JSON
public static List<Player> parsePlayers(JSONArray jsonData) {
List<Player> result = new ArrayList<>();
for (Object jsonDatum : jsonData) {
JSONObject countryPlayers = (JSONObject) jsonDatum;
String country = (String) countryPlayers.get("CountryName");
JSONArray players = countryPlayers.getJSONArray("Participations");
for (Object o : players) {
Player player = getPlayer((JSONObject) o, country);
result.add(player);
}
}
return result;
}
6. 性能改进
6.1 JSON解析
1. 问题:Json数据本身过大,包含大量数据,导致入库速度慢
改进方法:提高解析效率
具体措施:使用支持流式处理的库,这样可以边读取边解析。采用JAVA开源库com.fasterxml.jackson.core,该库具有良好的性能和扩展性,可以处理大量的JSON数据,支持流式处理、无锁方式、异步0等特性。同时,它也支持许多不同的数据格式,包括JSON、XML、YAML等。
6.2 JSON文件定位
2. 问题:读取input.txt命令后,才进行JSON文件的路径处理,耗时长
改进方法:采用HashMap存放JSON文件路径
具体措施:在HashMap中以键值对的方式存储命令和其对应的JSON文件路径,当读取到该命令时,直接从HashMap中取出JSON文件,减少运行时间。
7. 单元测试
对可能出现的异常情况进行测试,主要有以下几个部分:
- JSON文件的读取与解析
- 命令行参数的缺失
- IO异常情况处理
- 读取运动员信息
- 输出给定项目决赛的结果
8. 异常处理
8.1 命令行参数错误
if (args.length < 1 || args.length > 2) {
System.out.println("请指定命令文件及输出文件");
}
String inputFile = args[0];
String outputFile;
if (args.length == 2) {
outputFile = args[1];
} else {
outputFile = "output.txt";
}
else if(com == null){
FileOutputStream outputStream = new FileOutputStream(filename,true);
outputStream.write(("Error"+"\r\n").getBytes());
outputStream.write(("-----"+"\r\n").getBytes());
}else{
FileOutputStream outputStream = new FileOutputStream(filename,true);
outputStream.write(("N/A"+"\r\n").getBytes());
outputStream.write(("-----"+"\r\n").getBytes());
}
9. 心得体会
在作业过程中,我学到了很多关于数据处理和转换的知识。首先,我发现JSON格式非常适合用来存储和传输数据,因为它具有简单易读的结构,并且支持各种数据类型。
其次,在读取和解析JSON文件时,我学会了使用JAVA语言库来实现这一功能。例如使用AVA开源库com.fasterxml.jackson.core。
到了很多关于数据处理和转换的知识。首先,我发现JSON格式非常适合用来存储和传输数据,因为它具有简单易读的结构,并且支持各种数据类型。
其次,在读取和解析JSON文件时,我学会了使用JAVA语言库来实现这一功能。例如使用AVA开源库com.fasterxml.jackson.core。
另外,在处理JSON数据时,我也学到了如何处理错误和异常情况,以及如何优化和提高程序的性能。通过对JSON文件读取与解析的实践,我不仅提高了自己的编程能力,还加深了对数据处理和转换的理解。希望通过不断的实践和学习,能够进一步提升自己在数据处理方面的能力。