这个作业属于哪个课程 | 软件工程实践2022年春-F班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 解析JSON文件,实现一个可以统计国家奖牌数的程序 |
其他参考文献 | 百度 |
Gitcode项目地址
好几次的修改都提交在这了:所有的修改版本
后面才发现要求提交到这gitcide项目地址:fork来的gitcode仓库有错误
但是似乎新库存在一些问题不知如何解决,所以还是用来原来自己的库。
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 110 |
• Estimate | • 估计这个任务需要多少时间 | 30 | 40 |
Development | • 开发 | 1200 | 1800 |
• Analysis | • 需求分析 (包括学习新技术) | 100 | 120 |
• Design Spec | • 生成设计文档 | 60 | 60 |
• Design Review | • 设计复审 | 30 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
• Design | • 具体设计 | 120 | 200 |
• Coding | • 具体编码 | 600 | 850 |
• Code Review | • 代码复审 | 60 | 120 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 150 |
Reporting | 报告 | 120 | 120 |
• Test Repor | • 测试报告 | 60 | 60 |
• Size Measurement | • 计算工作量 | 30 | 60 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 60 |
合计 | 2650 | 3810 |
解题思路描述
然后根据命令行的指令,读取需要处理的命令,优先判断命令的合法性,根据判断结果输出错误信息或者解析对应的数据文件,结果输出到对应的文件中。
接口设计和实现过程
关键代码展示
处理命令的特殊情况下发生的错误
public class ProcessCommand {
public static Map<String,String> dateMap=new HashMap<>();
public static String HandleString(String data) throws UnsupportedEncodingException {
init();
String str=null;
data=data.trim();
String[] instruction=data.split("\\s+");
if(instruction[0].equals("total")){
ResolveTotal total=new ResolveTotal();
str=total.HandleTolJson(instruction[0]);
return str;
}else if(instruction.length==2&&instruction[0].equals("schedule")){
ResolveJSON schedule=new ResolveJSON();
if (dateMap.get(instruction[1])!=null){
str = schedule.HandleSchJson(instruction[1]);
return str;
}
else{
str="日期不在范围";
return str;
}
}
else{
str="Error"+"\n"+"-----";
return str;
}
}
public static void init()
{
dateMap.put("0202","0202");
dateMap.put("0203","0203");
dateMap.put("0204","0204");
dateMap.put("0205","0205");
dateMap.put("0206","0206");
dateMap.put("0207","0207");
dateMap.put("0208","0208");
dateMap.put("0209","0209");
dateMap.put("0210","0210");
dateMap.put("0211","0211");
dateMap.put("0212","0212");
dateMap.put("0213","0213");
dateMap.put("0214","0214");
dateMap.put("0215","0215");
dateMap.put("0216","0216");
dateMap.put("0217","0217");
dateMap.put("0218","0218");
dateMap.put("0219","0219");
dateMap.put("0220","0220");
}
}
解析JSON文件,大致过程类似
public class ResolveJSON {
public String HandleSchJson(String str) throws UnsupportedEncodingException {
InputStream inputStream =ResolveJSON.class.getResourceAsStream("/data/schedule/"+str+".json");
if(inputStream!=null){
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
JsonParser parser = new JsonParser();
JsonObject object = (JsonObject) parser.parse(bufferedReader);
JsonObject data = object.get("data").getAsJsonObject();
JsonArray list = data.get("matchList").getAsJsonArray();
StringBuilder stringBuilder = new StringBuilder();
Gson gson = new Gson();
for (int i = 0; i < list.size() - 1; i++) {
ReadSchedle schedule1 = gson.fromJson(list.get(i).getAsJsonObject(), ReadSchedle.class);
stringBuilder.append(schedule1.toString());
if(i!=list.size()-2){
stringBuilder.append("\n");
}
}
return stringBuilder.toString();
}else{
return "N/A"+"\n"+"-----";
}
}
}
性能改进
用遍历Map来取代遍历文件,从而判断日期是否符合范围。
一个解析类来解析JSON后传输给保存类,分散功能,如ResolveJSON类和ReadSchedle类。
单元测试
用如下代码判断输出文件与标准文件是否内容一致
public class testfile {
/**
* 判断两个文件的内容是否相同,文件名要用绝对路径
* @param fileName1 :文件1的绝对路径
* @param fileName2 :文件2的绝对路径
* @return 相同返回true,不相同返回false
*/
public boolean isSameFile(String fileName1,String fileName2){
FileInputStream fis1 = null;
FileInputStream fis2 = null;
try {
fis1 = new FileInputStream(fileName1);
fis2 = new FileInputStream(fileName2);
int len1 = fis1.available();//返回总的字节数
int len2 = fis2.available();
if (len1 == len2) {//长度相同,则比较具体内容
//建立两个字节缓冲区
byte[] data1 = new byte[len1];
byte[] data2 = new byte[len2];
//分别将两个文件的内容读入缓冲区
fis1.read(data1);
fis2.read(data2);
//依次比较文件中的每一个字节
for (int i=0; i<len1; i++) {
//只要有一个字节不同,两个文件就不一样
if (data1[i] != data2[i]) {
System.out.println("文件内容不一样");
return false;
}
}
System.out.println("两个文件完全相同");
return true;
} else {
//长度不一样,文件肯定不同
return false;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//关闭文件流,防止内存泄漏
if (fis1 != null) {
try {
fis1.close();
} catch (IOException e) {
//忽略
e.printStackTrace();
}
}
if (fis2 != null) {
try {
fis2.close();
} catch (IOException e) {
//忽略
e.printStackTrace();
}
}
}
return false;
}
异常处理
判断日期的范围的异常
输入输出的异常
文件读写的异常
心得体会
1、对待新知识一定要认真的学习,一个细节搞不懂就会被耽误很多时间。
2、读取文件一定要注意地址和格式。