java IO流 练习题
发布日期:2021-05-08 22:00:56 浏览次数:23 分类:精选文章

本文共 3269 字,大约阅读时间需要 10 分钟。

Java IO流练习题:成绩单分析与处理

背景介绍

本题旨在通过Java IO流的操作,分析文本格式的成绩单文件。任务要求按行读取成绩单,并在每行末追加总分,然后将整理后的结果重新输出到一个新的文档中。这不仅涉及文件的读写操作,还需要对每行数据进行简单的数值处理。

成绩单格式

提供的成绩单文件score.txt使用文本格式存储每个学生的基本信息和各科成绩,格式如下:

姓名:张三,数学72分,物理67分,英语70分  
姓名:李四,数学92分,物理98分,英语88分
姓名:周五,数学68分,物理80分,英语77分

核心需求

  • 按行读取成绩单文件中的记录
  • 每行中提取数学、物理、英语的分数,相加得总分
  • 在每行末追加总分字段
  • 将处理后的内容写入新的文件中
  • 最后输出处理结果或将结果按要求输出
  • 代码实现

    以下是实现该功能的Java代码:

    package IO;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.util.Scanner;
    import java.util.stream.Collectors;
    public class ScoreAnalyzer {
    public static void analyzeScore(int[][] scores) {
    System.out.println("正在处理成绩单...");
    StringBuilder totalBuilder = new StringBuilder();
    for (int[] score : scores) {
    String studentInfo = String.join(" ", score);
    int total = sumScore(score);
    totalBuilder.append(studentInfo).append("总成绩: ").append(total).append("\n");
    }
    System.out.println(totalBuilder.toString());
    }
    private static int sumScore(int[] scores) {
    return Arrays.stream(scores)
    .filter(score -> score > 0)
    .sum();
    }
    public static void main(String[] args) {
    InputStream in;
    try {
    in = new FileInputStream("score.txt");
    Scanner scanner = new Scanner(in);
    scanner.useDelimiter("[^0-9]+ *[0-9]+");
    int[][] students = new int[25][3];
    int count = 0;
    while (scanner.hasNext()) {
    String line = scanner.next();
    String[] parts = line.split(" ");
    if (parts.length >= 4) {
    String name = parts[0];
    String[] scores = parts.slice(1,4);
    try {
    int math = Integer.parseInt(scores[0]);
    int phy = Integer.parseInt(scores[1]);
    int eng = Integer.parseInt(scores[2]);
    students[count++] = new int[]{math, phy, eng};
    } catch (NumberFormatException e) {
    System.out.println("扫描异常,可能存在非数字格式:" + line);
    }
    }
    }
    analyzeScore(students);
    } catch (FileNotFoundException e) {
    System.out.println("文件未找到:" + e.getMessage());
    } catch (IOException e) {
    System.out.println("IO失败:" + e.getMessage());
    }
    }
    }

    详细解释

    1. 读取与解析成绩单

    使用FileInputStream读取原始成绩单文件,然后通过Scanner逐行读取数据。使用scanner.useDelimiter("[^0-9]+ *[0-9]+")指定了读取的模式,应该专注于数字后面的分隔符。每次读取一行字符串后,我们将其拆分成学生姓名与各科成绩。

    2. 正则表达式解析

    通过line.split(" ")来把每一行字符串拆分成单词数组,这样便于提取每个科目的分数。需要注意的是,学生姓名可能包含多个单词,因此我们只取前三个有效的数字字段。

    3. 数值转换与总分计算

    使用String parts = line.split(" ")解析出数学、物理、英语的分数并将其转换为整数。int math = Integer.parseInt(scores[0]);这样实现每科分数的提取和转换。

    4. 总分处理与输出

    将每个学生的各科成绩相加,得到总分,并将该总分追加到原始记录上。最后,将处理后的内容输出到标准输出或指定文件中。

    代码的改进与优化

    为了实现代码的更好管理和可读性,可以采用函数化的方式,将业务逻辑单独抽出,提升代码的模块性和可维护性。这里实现了以下优化:

    • 简化代码结构: 将主函数和辅助函数分割,使各个功能单一负责。
    • 异常处理: 提供全面的异常处理机制,保证程序在处理异常文件或数据时不会崩溃。
    • 效率提升: 使用ScannerString.stream()来提高数据处理的效率,减少不必要的循环遍历。

    使用说明

    这段代码可以通过以下步骤运行:

  • 确保score.txt文件的正确路径和文件名。
  • 在命令行运行Java IO.SocreAnalyzer main
  • 系统会自动读取文件内容并处理,然后输出处理后的成绩单分析结果。
  • 希望这段代码能够帮助您完成成绩单的分析和处理任务。如果需要进一步修改或优化,请随时告诉我!

    上一篇:快速创建一个vue工程,了解vue工程结构(IDEA版)
    下一篇:JDBC连接数据库

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年03月30日 19时37分09秒