软件工程第二次作业--文件提取

222100207王科竣 2024-03-03 02:14:23
这个作业属于哪个课程福州大学-2302软件工程
这个作业要求在哪里软件工程第二次作业--文件读取
这个作业的目标掌握文件读取、JSON解析、单元测试
其他参考文献源代码管理,《Git入门》,软件工程师的能力评估和职业发展...

目录

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

Gitcode项目地址

仓库地址

PSP表格

PSP阶段Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划2020
• Estimate- 估计这个任务需要多少时间2020
Development开发710890
• Analysis- 需求分析(包括学习新技术)120150
• Design Spec- 生成设计文档2020
• Design Review- 设计复审3030
• Coding Standard- 代码规范 (为目前的开发制定合适的规范)2030
• Design- 具体设计4060
• Coding- 具体编码360450
• Code Review- 代码复审6090
• Test- 测试(自我测试,修改代码,提交修改)6090
Reporting报告80140
• Test Report- 测试报告40100
• Size Measurement- 计算工作量2020
• Postmortem & Process Improvement Plan- 事后总结, 并提出过程改进计划2020
合计8101050

解题思路描述

问题1

解析athletes.json

img


分别为国籍,性别,姓名

问题2

解析event.json

img


分别为比赛名,详细信息id路径


img


分别为总成绩,单轮,排名,姓名

接口设计和实现过程

  • 主要的类有文件处理类Filehandle.java,选手输出类PlayerOUT.java和比赛输出MatchOUT.java。
  • 文件处理类读取各行命令,进行选手输出或比赛输出。
  • 选手输出类和比赛输出类,进行JSON文件的读取与解析、TXT文件的写入。其中jsonTostring(String js),负责将JSON文件转成字符串,交由fastjson2解析。getID()函数,取得比赛json路径名。
  • 实现过程:编写文件处理类,读取命令,进行进行选手输出或比赛输出类的创建、打印。

关键代码展示

  1. 文件处理读取命令的实现

             File filename = new File(inputFile); // 读取以上路径的input.txt
             InputStreamReader reader = new InputStreamReader(
                     new FileInputStream(filename)); // 输入流对象reader
             BufferedReader br = new BufferedReader(reader);
             String line = "";
             line = br.readLine();
    
             /* 写入Txt文件 */
             File writename = new File(outputFile);
             writename.createNewFile(); // 创建新output文件!!!!!!!!!!!!!!!!!!!!!
             BufferedWriter out = new BufferedWriter(new FileWriter(writename));
    
             while (line != null) {
                 System.out.println(line);
                 String[] command = line.split("\\s");
    
                 if (!command[0].equals("result") && !command[0].equals("players")) {
                     try {
                         //错误指令
                         out.write("Error\r\n");
                         out.write("-----\r\n");
                         out.flush(); // 缓存区内容压入文件
                     }
                     catch (Exception e) {
                         System.out.println("写入错误!!!");
                     }
                 }
                 else if (command[0].equals("players")) {
                     PlayerOUT playerOUT = new PlayerOUT(line,outputFile);
                     playerOUT.playerWrite();
                     //System.out.println("\n比赛选手....\n");
                 }
                 else if (command[0].equals("result")) {
                     MatchOUT matchOUT = new MatchOUT(line,outputFile);
                     matchOUT.matchWrite();
                     //System.out.println("\n比赛结果....\n");
                 }
    
                 line = br.readLine(); // 一次读入一行
             }
             out.close(); // 关闭文件
    
  2. JSON文件转成字符串的实现

     private String jsonTostring(String js) {
         String json = "";
         Path path = Paths.get(js);
    
         try {
             // 使用 Files 类的 readAllBytes 方法,将文件的所有字节读取到一个 byte 数组中
             byte[] bytes = Files.readAllBytes(path);
             // 使用 Charset 类的 forName 方法,指定字符编码为 UTF-8,并将 byte 数组转换为字符串
             json = new String(bytes, Charset.forName("UTF-8"));
             //System.out.println(json);
         }
         catch (IOException e) {
             // 处理异常
             e.printStackTrace();
         }
         // 返回输出字符串
         return json;
     }
    
  3. 比赛详细信息输出的实现

             File writename = new File(ouputFile);
             //writename.createNewFile(); // 创建新文件
             BufferedWriter out = new BufferedWriter(new FileWriter(writename,true));//不覆写
    
             if (!isFound()) {
                 out.write("N/A" + "\n");
                 out.write("-----" + "\n");
                 System.out.println("没找到。。。!!!!!!!!!!!!!!!!!!!!!!!!!");
             }
             else {
                 String id = getID();
                 String json = jsonTostring("src/datas/results/" + id + ".json");;
                 //System.out.println("src/datas/results/" + id + ".json");
    
                 JSONObject jsonObject = JSON.parseObject(json);
    
                 JSONArray Heats=jsonObject.getJSONArray("Heats");
                 JSONObject jsonObject1=Heats.getJSONObject(0);
                 JSONArray Results=jsonObject1.getJSONArray("Results");
    
                 for (int i = 0; i < Results.size(); i++) {
                     String scoreString = "";
    
                     JSONObject res = Results.getJSONObject(i);
                     String fullname = res.get("FullName").toString();
                     String rank = res.get("Rank").toString();
                     String totalpoints = res.get("TotalPoints").toString();
                     JSONArray dives=res.getJSONArray("Dives");
    
                     //分数加法式拼接
                     for (int j = 0; j < dives.size()-1; j++) {
                         JSONObject scores=dives.getJSONObject(j);
                         String score= scores.get("DivePoints").toString();
    
                         scoreString = scoreString+score+" + ";
                     }
                     JSONObject scores=dives.getJSONObject(dives.size()-1);
                     String score= scores.get("DivePoints").toString();
                     scoreString = scoreString+score;
    
                     out.write("Full Name:"+fullname.replace("/","&")+"\n");//双人项目,选手姓名格式命名为'A & B'
                     out.write("Rank:"+rank+"\n");
                     out.write("Score:"+scoreString+" = "+totalpoints+"\n");
                     out.write("-----"+"\n");
    
                     out.flush(); // 缓存区内容压入文件
                 }
                 //out.write("-----" + "\n");
                 System.out.println("找到。。。!!!!!!!!!!!!!!!!!!!!!!!!!");
             }
             out.close(); // 关闭文件
    

性能改进

比赛命令判断时,查找太慢。

处理:使用list储存命令,快速查找判断。


img


单元测试

使用junit4测试了正常输出,与错误输出:

  1. 无法识别的指令,则输出Error
  2. result后的比赛项目名称应为如下这些名称之一,如果不正确,则输出N/A

    img



img


异常处理

文件读取写入异常处理:

img



img


心得体会

在此次作业中,我学会了使用JAVA库来读取和解析JSON文件,了解了Java处理json文件的转化与储存输出,更加熟悉了文件的读取写入。此外,我还学会了过去编程时没有接触过的依赖的引入、单元测试的使用,在网上的学习和请教下,终于实现了功能。通过不断的实践和学习,我的编程能力得到了提升,而且更加熟悉了实际编程活动中,使用git管理项目和git提交流程与做法。

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

122

社区成员

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

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