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

这个作业属于哪个课程2023软件工程
这个作业要求在哪里文件读取
这个作业的目标完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序
其他参考文献单元测试

目录:

  1. Gitcode项目地址
  2. PSP表格
  3. 解题思路描述
  4. 接口设计和实现过程
  5. 关键代码展示
  6. 性能改进
  7. 单元测试
  8. 异常处理
  9. 心得体会

1. Gitcode项目地址

222100219/ Project Java

2. PSP表格

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

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 主要的类

  1. 数据模型类:根据JSON文件的数据结构进行设计。例如选手信息,根据作业的输出要求和JSON的数据结构进行设计,类Player包含3个字段:fullname、gender和country。
  2. 文件对应类:根据作业给出的JSON文件,提取出各个赛事对应的命令,并用C进行存储,有利于提高程序的处理速度。
  3. 逻辑处理类:包含了多个逻辑处理方法,例如:JSON文件的读取与解析、TXT文件的读取与写入等。

4.2 指令实现过程(实现逻辑)

  1. 读取input.txt文件,初始化指令List
  2. 逐行读取指令,并进行判断。若是非法指令,输出Error;若指令有误,则输出N/A;若指令为players或result形式的正确指令,则进行下一步处理。
  3. 根据指令类型进行响应的处理。
  4. 重复步骤2,直到指令List为空。
  5. 结束进程。

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. 单元测试

对可能出现的异常情况进行测试,主要有以下几个部分:

  1. JSON文件的读取与解析
  2. 命令行参数的缺失
  3. IO异常情况处理
  4. 读取运动员信息
  5. 输出给定项目决赛的结果
    在这里插入图片描述
    在这里插入图片描述

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文件读取与解析的实践,我不仅提高了自己的编程能力,还加深了对数据处理和转换的理解。希望通过不断的实践和学习,能够进一步提升自己在数据处理方面的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值