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

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

这个作业属于哪个课程软件工程社区
这个作业要求在哪里软件工程第二次作业
这个作业的目标完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序

Gitcode项目地址

gitcode地址: link

PSP表格

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

解题思路描述

首先用阿里巴巴的fastjson2对跳水官网json数据进行读取,获取利用jsonobject和jsonarray将运动员信息和赛事信息的json数据转化为字符串,再将他们按格式输出。
先构造一个DWASearch类,再分别构造player和result类,最后将方法都放在tools类中,由DWASearch类做main函数启动。

关键代码展示

输出运动员信息

public void showPlayer(String outputFileName) {
        List<Player> players = new ArrayList<>();
        InputStream is = DWASearch.class.getClassLoader().getResourceAsStream("data/athletes.json");
        String jsonStr = "";
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = in.readLine()) != null) {
                buffer.append(line);
            }
            jsonStr = buffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONArray jsonArray = JSONArray.parseArray(jsonStr);
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject object = jsonArray.getJSONObject(i);
            String Country = object.getString("CountryName");
            JSONArray Participations = object.getJSONArray("Participations");
            for (int j = 0; j < Participations.size(); j++) {
                String fullName = Participations.getJSONObject(j).getString("PreferredFirstName") + " "
                        + Participations.getJSONObject(j).getString("PreferredLastName");
                String Gender = (Participations.getJSONObject(j).getInteger("Gender") == 1 ? "Male" : "Female");
                players.add(new Player(fullName, Gender, Country));
            }
            sortPlayers(players);
            writePlayersToFile(players, outputFileName);
            //将运功员信息输出至文件
        }
    }

输出比赛结果信息

public void showResult(String outputFileName, String eventAdress) {
        List<Result> results = new ArrayList<>();
        InputStream is = DWASearch.class.getClassLoader().getResourceAsStream(eventAdress);
        String jsonStr = "";
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = in.readLine()) != null) {
                buffer.append(line);
            }
            jsonStr = buffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject object = JSONObject.parseObject(jsonStr);
        JSONArray heat = object.getJSONArray("Heats");
        JSONObject object1 = heat.getJSONObject(0);
        JSONArray result = object1.getJSONArray("Results");// 获取决赛数据
        for (int i = 0; i < result.size(); i++) {
            JSONObject playerResult = result.getJSONObject(i);
            String fullname = playerResult.getString("FullName");
            String rank = playerResult.getString("Rank");
            String totalpoints = playerResult.getString("TotalPoints");
            String detailpoints = "";
            List<String> doubleplayer = new ArrayList<>();
            
            //判断是否双人比赛
            if (playerResult.getString("Competitors") != null) {
                JSONArray competitors = playerResult.getJSONArray("Competitors");
                for (int j = 0; j < competitors.size(); j++) {
                    JSONObject eachone = competitors.getJSONObject(j);
                    String name = eachone.getString("LastName") + " " + eachone.getString("FirstName");
                    doubleplayer.add(name);
                }
                Collections.sort(doubleplayer);
                fullname = "'" + doubleplayer.get(0) + "&" + doubleplayer.get(1) + "'";
            }
            JSONArray dives = playerResult.getJSONArray("Dives");
            for (int k = 0; k < dives.size(); k++) {
                JSONObject single = dives.getJSONObject(k);
                String Single = single.getString("DivePoints");
                if (k < dives.size() - 1) {
                    detailpoints = detailpoints + Single + "+";
                } else {
                    detailpoints = detailpoints + Single;
                }
            }
            results.add(new Result(fullname, rank, detailpoints, totalpoints));
            writeResultsToFile(results, outputFileName);
        }
    }

写入文件

private void writeResultsToFile(List<Result> results, String fileName) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true))) {
            for (Result result : results) {
                writer.write("FullName: " + result.getFullname() + "\n");
                writer.write("Rank: " + result.getRank() + "\n");
                writer.write("Score:" + result.getDetailpoints() + "=" + result.getTotalpoints() + "\n");
                writer.write("-----\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

private void writePlayersToFile(List<Player> players, String fileName) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true))) {
            for (Player player : players) {
                writer.write("Full Name: " + player.getFullName() + "\n");
                writer.write("Gender: " + player.getGender() + "\n");
                writer.write("Country: " + player.getCountry() + "\n");
                writer.write("-----\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

代码启动器

public class DWASearch {
    public static void main(String[] args) throws Exception {
        // if (args.length != 2) {
        // System.out.println("Usage: java -jar DWASearch.jar input.txt output.txt");
        // return;
        // }
        String inputFileName = args[0];
        String outputFileName = args[1];
        tools tool = new tools();
        tool.input(inputFileName, outputFileName);

    }
}

性能改进

在输入检测端我用了if-else结构来检测输入结果,内存占用较高,可以改成hashmap来写,节省内存,减少读取时间

单元测试

public class toolsTest {

    @Test
    public void input() throws IOException {
        String str = "input.txt";
        String str2 = "output.txt";
        new tools().input(str,str2);
    }

    @Test
    public void showPlayer() {
        String str = "input.txt";
        String str2 = "output.txt";
        new tools().showPlayer(str2);
    }

    @Test
    public void showResult() {
        String str2 = "output.txt";
        new tools().showResult(str2,"data/men 1m springboard.json");
    }

    @Test
    public void showResult1() {
        String str2 = "output.txt";
        new tools().showResult(str2,"data/men 1m springboard.json");
    }
}

以下是第一个用例测试的覆盖率
在这里插入图片描述

异常处理

catch (IOException e) {
            e.printStackTrace();
        }

项目中出现的绝大多数异常都使用try/catch环绕,并将异常放入堆栈中。对于命令行出现的找不到文件异常,即是改变读取文件的方式解决。

心得体会

本次实践让我学会了用fastjson2对json文件的读取操作,更加熟悉了对java的使用和文件的读取写入方法,以及gitcode的操作

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二进制文件是一种以二进制形式存储数据的文件,与文本文件不同,它们不包含任何格式化的文本,而是包含计算机可以直接理解的二进制数据。在Python中,我们可以使用内置的open()函数来读写二进制文件。 要打开一个二进制文件,我们需要将文件模式设置为“rb”(读取二进制文件)或“wb”(写入二进制文件)。例如,要打开一个名为“example.bin”的二进制文件进行读取,我们可以使用以下代码: ``` with open("example.bin", "rb") as f: data = f.read() ``` 这将打开“example.bin”文件并将其内容读取到变量“data”中。我们可以使用相同的方式来写入二进制文件: ``` with open("example.bin", "wb") as f: f.write(data) ``` 这将把变量“data”中的内容写入到“example.bin”文件中。请注意,写入二进制文件时,我们需要确保我们写入的数据是二进制数据,而不是字符串或其他格式的数据。 ### 回答2: Python中的文件操作是非常重要的,许多常见的编程任务都涉及文件的读写。其中,二进制文件的读写更是需要特别注意。 二进制文件是指保存在计算机上的文件,其内容以二进制形式存储。相对于文本文件,二进制文件通常更小,更快,并且可以直接访问文件中的任意位置。常见的二进制文件有图片、视频、音频等。 Python提供了许多函数来读取和写入二进制文件。 开始讲解二进制文件读取。打开二进制文件的过程与打开文本文件相同,只需要在打开文件时指定打开方式为“rb”(读取二进制文件)。读取文件内容时采用read()函数进行读取,它将读取整个文件的内容并将其作为一个字符串返回。read()函数还接受一个参数,表示要读取的最大字节数。如果不传入该参数,则读取整个文件读取二进制文件的示例代码如下: ```python with open("binary_file", "rb") as f: contents = f.read() # 读取整个文件 print(contents) ``` 接下来是二进制文件的写入。与读取类似,打开文件时需要指定打开方式为“wb”(写入二进制文件)。写入文件的内容可以使用write()函数进行写入,它接受一个二进制字符串作为参数,并将其写入文件。写入二进制文件的示例代码如下: ```python with open("binary_file", "wb") as f: f.write(b"Hello, world!") # 写入字符串 ``` 需要注意的是,写入二进制文件时需要使用二进制字符串(即在字符串前面加b),否则Python会将字符串转换为ASCII编码并写入文件,这样就无法正确地写入二进制数据了。 除了读取和写入整个文件,我们还可以使用seek()函数在二进制文件中定位到指定位置,并从该位置开始读取或写入数据。seek()函数接受两个参数,第一个参数表示要跳过的字节数,第二个参数表示跳跃的起点。如果第二个参数为0,则以文件起始位置为起点;如果为1,则以当前位置为起点;如果为2,则以文件末尾为起点。示例代码如下: ```python with open("binary_file", "rb") as f: f.seek(5) # 跳过前5个字节 contents = f.read(10) # 读取10个字节 print(contents) with open("binary_file", "wb") as f: f.seek(5, 0) # 跳到第5个字节 f.write(b"World") # 向文件中写入"World" ``` 通过上述介绍,我们知道了Python中读写二进制文件的方法及注意事项,希望这篇文章对初学者有所帮助。 ### 回答3: Python中文件的读写是程序中非常基础和常用的一项功能。文件可以分为文本文件和二进制文件。二进制文件和文本文件不同的是,二进制文件并不是由一些可读的字符组成,而是由计算机能够识别的比特流组成,因此在读写二进制文件时需要使用二进制模式的文件操作。 在Python中,我们可以使用open()函数打开一个文件,而如果要打开二进制文件,需要在文件名的第二个参数中添加'b'。比如,我们可以使用以下代码读取一个二进制的图片文件: ```python with open('image.png', 'rb') as f: img_data = f.read() ``` 上述代码中,以二进制模式打开了一个名为image.png的文件,将文件中的内容读取到了一个变量img_data中。在读取完毕之后,使用with语句自动关闭了文件。 当我们要写入二进制文件时,我们也需要使用二进制模式的文件操作。比如,我们可以使用以下代码将一个字节串写入一个二进制文件中: ```python with open('binary.bin', 'wb') as f: f.write(b'\x00\x01\x02\x03') ``` 上述代码中,使用with语句打开了一个名为binary.bin的文件,并使用二进制模式打开,将一个字节串b'\x00\x01\x02\x03'写入了文件中。在写入完毕之后,使用with语句自动关闭了文件。 需要注意的是,二进制文件中包含的数据需要按照特定的格式进行解析才能正确读取。比如,在读取一个位图文件时,需要先读取文件头(header)中的各项属性,然后根据这些属性去解析文件中的像素数据。这就需要我们使用Python中的结构体(struct)模块,按照特定的格式读取二进制数据。例如: ```python import struct with open('bitmap.bmp', 'rb') as f: # 读取文件头 header = f.read(14) # 解析文件头 _, _, _, _, _, size, _, _, _, offset = struct.unpack('<2sIHHI', header) # 读取像素数据 f.seek(offset) data = f.read(size - offset) ``` 上述代码中,使用struct.unpack()解析了一个长度为14的文件头(header),然后根据header中的信息读取了像素数据。其中'<2sIHHI'用于表示不同属性的长度和类型,具体可以参考Python官方文档。 在处理二进制文件时还需要注意一些常见的问题,比如在读取或写入文件时,需要注意字节序(endian)的问题,需要进行正确的错误处理等。 总之,学习如何读写二进制文件是Python编程中很重要的一环,可以帮助我们更好地处理计算机中的数据和文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值