23软件工程--文件读取

052101407吴伟杰 2024-03-03 03:07:01
这个作业属于哪个课程班级的链接
这个作业要求在哪里软件工程实践第二次作业—文件读取
这个作业的目标完成对澳大利亚网球公开赛相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序
其他参考文献

目录:

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

https://gitcode.net/m0_72507766/project-java

2. PSP表格
阶段描述预估耗时(分钟)实际耗时(分钟)
Planning计划1010
Estimate估计这个任务需要多少时间1010
Development开发600500
Analysis需求分析(包括学习新技术)120100
Design Spec生成设计文档2050
Design Review设计复审6060
Coding Standard代码规范2030
Design具体设计12060
Coding具体编码360450
Code Review代码复审3075
Test测试(自我测试,修改代码,提交修改)120120
Reporting报告6040
Test Report测试报告8060
Size Measurement计算工作量6020
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6060
合计16701645
3. 解题思路描述

数据是从助教的data中获取,这里就不详细说明。当我们看到数据是json文件时,我们可以去分析它的具体结构,如下:

QQ图片20240303023304.png


QQ图片20240303023312.png


可以使用jsonarray和jsonobject一层层拨开获取数据。
根据要求,代码的主要功能是获取json数据,根据input文件内容输出到output文件,显然,我们可以在DWASearch类中传递input与output,由Lib类获取数据并判断input的内容调用Core输出方法到output。

4. 接口设计和实现过程

由上述分析可知,需要先导入阿里巴巴的gron解析包(fastjson出了点问题所以改用谷歌的),调用gron的jsonObject与jsonArray去解析对应数据
DWASearch类中由args[0],args[1]从命令行读取input,output,并调用Lib类的judge方法向其传递数据
Lib类可以用hashmap来存储json路径的映射关系,并用judge()判断,根据判断结果调用Core的outputathlete()和outputolayer()。

5. 关键代码展示
    public class DWASearch {
    public static void main(String[] args)  {
        Lib lib=new Lib();
        List<String>commands =Lib.readinput(args[0]);
        lib.judge(commands,args[1]);
    }
}
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
class Core {
    public static void outputAthletesInfo(String filename) {
        try {
            FileOutputStream fos = new FileOutputStream(filename, true);
            JsonArray jsonArray = parseJsonString(readJsonFile("data/athletes.json")).getAsJsonArray();

            // 一层一层拨开数据
            for (int i = 0; i < jsonArray.size(); i++) {
                JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
                String countryName = jsonObject.get("CountryName").getAsString();
                JsonArray participations = jsonObject.get("Participations").getAsJsonArray();
                for (int j = 0; j < participations.size(); j++) {
                    JsonObject participation = participations.get(j).getAsJsonObject();
                    String fullName = participation.get("PreferredLastName").getAsString() + " " + participation.get("PreferredFirstName").getAsString();
                    fos.write(("FullName:" + fullName + "\r\n").getBytes());
                    String gender = (participation.get("Gender").getAsInt() == 0 ? "Male" : "Female");
                    fos.write(("Gender:" + gender + "\r\n").getBytes());
                    fos.write(("Country:" + countryName + "\r\n").getBytes());
                    fos.write(("-----" + "\r\n").getBytes());
                }
            }
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //篇幅原因只展示部分
    ////
    ////
    public static JsonObject parseJsonString(String jsonString) {
        JsonParser parser = new JsonParser();
        return parser.parse(jsonString).getAsJsonObject();
    }
    //解析JSON字符串并返回JsonObject对象
}
6. 性能改进

程序性能优化主要在于IO的重复操作,一方面可以使用BufferedReader加快读取

   BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            StringBuilder buffer = new StringBuilder();
            String line = "";
            while ((line = in.readLine()) != null) {
                buffer.append(line);
            }

另一方面可以避免重复读入,即已读过的不再读取,通过Hashmap映射json路径加快遍历

   public static String getjsonpath(String input) {
        Set<Map.Entry<String, String>> entries = command.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            if (entry.getKey().equals(input)) {
                return entry.getValue();
            }
        }
        return null;
    }
    //将HashMap中的每个键值对封装成一个Map.Entry对象,并将这些对象存储在一个Set集合中,方便对HashMap中的键值对进行遍历和操作。
7. 单元测试

测试采用java的Juit进行测试,在对应函数上写入@Test注释

   public class DWASearchTest {

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }
    @Test
        //参数个数测试
    public void Test1(){
        DWASearch.main(new String[]{"C:\\Users\\wuweijie\\Desktop\\新建文件夹\\project-java\\052101407\\src\\input"});//参数个数错误
    }
    @Test
    public void Test2(){
        DWASearch.main(new String[]{"C:\\Users\\wuweijie\\Desktop\\新建文件夹\\project-java\\052101407\\src\\input","C:\\Users\\wuweijie\\Desktop\\新建文件夹\\project-java\\052101407\\src\\output"});//参数正确
    }
    @Test
    public void Test3() {
        DWASearch.main(new String[]{"C:\\Users\\youngz\\Desktop\\FINAL\\src\\input", "C:\\Users\\youngz\\Desktop\\FINAL\\src\\output", "output.txt"});//参数个数错误
    }
    //参数格式测试
    @Test
    public void Test4() {
        DWASearch.main(new String[]{"input", "output"});
    }
    @Test
    public void Test5() {
        DWASearch.main(new String[]{"input.txt", "output"});
    }
    @Test
    public void Test6() {
        DWASearch.main(new String[]{"input", "output.txt"});//格式错误
    }
    @Test
    public void Test7() {
        DWASearch.main(new String[]{"1.txt", "2.txt"});//格式错误
    }
    @Test
    public void Test8() {
        DWASearch.main(new String[]{"input.txt", "output.txt"});//格式错误
    }
}

QQ图片20240303025235.png


QQ图片20240303025244.png

8. 异常处理

主要用到thorw和try catch处理IOexcepttion

9. 心得体会

终于完成辣,感谢同学和助教的帮助,整个流程下来,我时常出问题,甚至IDEA也是刚刚开始着手使用(之前用vscode,用不清楚还是),过程中不止遇到了code的问题,idea导入jar,maven等配置也是搞得一头雾水,但我还是学到了很多,jsonArray和jsonobject等配合Java的使用让我学到了不少,希望接下来的任务我也能以一颗积极的状态去面对,菜就要多练!

...全文
43 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

122

社区成员

发帖
与我相关
我的任务
社区描述
FZU-SE
软件工程 高校
社区管理员
  • LinQF39
  • 助教-吴可仪
  • 一杯时间
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧