
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. 总分处理与输出
将每个学生的各科成绩相加,得到总分,并将该总分追加到原始记录上。最后,将处理后的内容输出到标准输出或指定文件中。
代码的改进与优化
为了实现代码的更好管理和可读性,可以采用函数化的方式,将业务逻辑单独抽出,提升代码的模块性和可维护性。这里实现了以下优化:
- 简化代码结构: 将主函数和辅助函数分割,使各个功能单一负责。
- 异常处理: 提供全面的异常处理机制,保证程序在处理异常文件或数据时不会崩溃。
- 效率提升: 使用
Scanner
和String.stream()
来提高数据处理的效率,减少不必要的循环遍历。
使用说明
这段代码可以通过以下步骤运行:
score.txt
文件的正确路径和文件名。Java IO.SocreAnalyzer main
。希望这段代码能够帮助您完成成绩单的分析和处理任务。如果需要进一步修改或优化,请随时告诉我!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月30日 19时37分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Jupyter Notebook 暗色自定义主题
2021-05-09
[Python学习笔记]组织文件
2021-05-09
基于Redo Log和Undo Log的MySQL崩溃恢复流程
2021-05-09
从RocketMQ的Broker源码层面验证一下这两个点
2021-05-09
如何正确的在项目中接入微信JS-SDK
2021-05-09
纵览全局的框框——智慧搜索
2021-05-09
快服务流量之争:如何在快服务中占领一席之地
2021-05-09
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
2021-05-09
Unity平台 | 快速集成华为性能管理服务
2021-05-09
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
2021-05-09
使用Power BI构建数据仓库与BI方案
2021-05-09
Django认证系统并不鸡肋反而很重要
2021-05-09
快用Django REST framework写写API吧
2021-05-09
tep用户手册帮你从unittest过渡到pytest
2021-05-09
12张图打开JMeter体系结构全局视角
2021-05-09
Spring Boot 2.x基础教程:构建RESTful API与单元测试
2021-05-09
[UWP 自定义控件]了解模板化控件(1):基础知识
2021-05-09
UWP 自定义控件:了解模板化控件 系列文章
2021-05-09
[UWP]从头开始创建并发布一个番茄钟
2021-05-09
WinUI 3 Preview 3 发布了,再一次试试它的性能
2021-05-09