
一、实验概述本次上机实验围绕 Java 输入输出字符流完成举重成绩自动统计工具分为两个核心类Fenxi.java负责文本数字提取求和AnalysisResult.java完成文件读取、成绩计算、结果追加写入文件全流程。通过缓冲字符流实现文本文件高效读写结合正则与字符串分割完成成绩数值解析完整落地文件 IO 业务场景。二、整体解题思路1. 需求拆解读取本地score.txt举重原始成绩文本逐行处理提取每行文字中所有数字支持小数成绩自动累加计算总成绩原始文本拼接总成绩后控制台打印将处理后的完整数据追加写入新文件socreAnalysis.txt多次运行不覆盖历史数据捕获 IO 读写异常保证程序健壮性。2. 分层实现思路1数值解析层Fenxi 工具类正则表达式[^0123456789.]匹配所有非数字、非小数点字符将所有无关字符统一替换为分隔符*使用StringTokenizer按分隔符拆分纯数字字符串循环转换为 double 类型累加返回该行总成绩。2文件 IO 业务层AnalysisResult 主类底层文件流FileReader读取源文件FileWriter(file,true)开启追加模式输出缓冲包装用BufferedReader、BufferedWriter封装底层文件流提供readLine()按行读取、newLine()换行等便捷方法循环逐行读取文件调用工具类计算总分拼接文本后输出控制台 写入目标文件流关闭读写完成手动关闭缓冲流释放资源异常捕获捕获IOException打印异常信息避免程序直接崩溃。3. 填空逻辑推导原题 4 处代码填空【代码 1】new FileWriter(fWrite, true)第二个参数 true 代表追加写入满足题目追加要求【代码 2】new BufferedWriter(out)缓冲输出流必须接收 Writer 子类对象做底层流【代码 3】new FileReader(fRead)文件字符输入流继承自 Reader 抽象类【代码 4】new BufferedReader(in)缓冲输入流包装 Reader实现按行读取。三、完整示例代码1. Fenxi.java数字解析工具类import java.util.*; public class Fenxi { public static double getTotalScore(String s) { //匹配所有非数字字符 String regex[^0123456789.]; String digitMesss.replaceAll(regex,*); StringTokenizer fenxi new StringTokenizer(digitMess,*); double totalScore0; while(fenxi.hasMoreTokens()){ double score Double.parseDouble(fenxi.nextToken()); totalScore totalScorescore; } return totalScore; } }2. AnalysisResult.java文件读写主程序import java.io.*; import java.util.*; public class AnalysisResult { public static void main(String args[]) { File fRead new File(score.txt); File fWrite new File(socreAnalysis.txt); try { //【代码1】追加模式文件字符输出流 Writer out new FileWriter(fWrite, true); //【代码2】缓冲输出流包装 BufferedWriter bufferWrite new BufferedWriter(out); //【代码3】文件字符输入流 Reader in new FileReader(fRead); //【代码4】缓冲输入流包装 BufferedReader bufferRead new BufferedReader(in); String str null; while((strbufferRead.readLine())!null) { double totalScoreFenxi.getTotalScore(str); str str 总成绩:totalScore; System.out.println(str); bufferWrite.write(str); bufferWrite.newLine(); } //关闭流 bufferRead.close(); bufferWrite.close(); }catch(IOException e) { System.out.println(e.toString()); } } }3.score.txt4.运行结果四、程序创新点通用数字提取工具解耦业务逻辑将数字提取、求和逻辑封装独立工具类Fenxi和文件 IO 操作完全分离后续任何文本数字统计场景可直接复用符合单一职责设计思想。兼容整数 / 小数成绩修复原代码正则缺陷原题原始正则仅匹配纯数字未包含小数点会导致小数拆分错误优化正则[^0123456789.]完美适配带小数点的举重成绩覆盖真实业务数据。追加写入模式支持多次迭代统计使用FileWriter(file,true)开启文件追加重复运行程序不会覆盖已有统计结果适合分批录入成绩、持续汇总的使用场景。缓冲流分层包装兼顾性能与易用性底层使用基础文件流操作磁盘上层缓冲流封装readLine()、newLine()等便捷 API相比原生单字符读写大幅提升大文本文件读写性能。文本无关性解析不限制文本格式无需固定文本分隔符无论文字、符号如何混杂均可自动过滤所有非数字内容提取分数不局限于举重成绩单可拓展到成绩单、账单、日志等数字提取场景。五、实验心得体会1. 技术知识点收获分清字节流与字符流适用场景处理中文文本文件优先使用Reader/Writer字符流避免中文乱码图片、视频等二进制文件才使用InputStream/OutputStream字节流。缓冲流是 IO 优化核心基础文件流单次读写效率极低BufferedReader/BufferedWriter内置缓冲区批量读写磁盘处理多行文本必须使用。文件追加写入关键FileWriter第二个布尔参数控制覆盖 / 追加模式日常日志、统计记录业务几乎都使用追加模式。正则在文本清洗的实用价值面对混杂文字和数字的不规则文本正则可以快速过滤无关字符简化数据提取流程省去复杂字符串截取逻辑。IO 资源释放规范文件流属于操作系统资源使用完毕必须手动close()关闭否则会占用文件句柄导致文件无法修改、删除。2. 踩坑总结最初未注意正则缺失小数点带小数成绩会解析报错修正正则后程序才能正常运行忘记在写入文件后调用newLine()所有输出内容会挤在同一行可读性极差流关闭顺序错误必须先关闭上层缓冲流再关闭底层文件流缓冲流关闭时会自动刷新缓冲区数据到磁盘未捕获 IO 异常直接编译报错所有文件读写操作都属于受检异常必须搭配try-catch或抛出异常。3. 拓展思考本次程序还有优化空间可以使用 try-with-resources 语法自动关闭流省去手动close()增加文件不存在判断提前提示用户创建score.txt封装配置文件名常量方便修改文件路径增加总分排序、平均分统计等拓展功能。通过本次 IO 实验我理解了 Java 文件操作的分层设计思想底层基础流负责硬件交互上层装饰流拓展功能这种装饰者模式也为后续学习 IO 高级用法打下基础。