news 2026/6/19 11:40:39

实验五 输入输出流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
实验五 输入输出流

一、实验概述

本次上机实验围绕 Java 输入输出字符流完成举重成绩自动统计工具,分为两个核心类:Fenxi.java负责文本数字提取求和,AnalysisResult.java完成文件读取、成绩计算、结果追加写入文件全流程。通过缓冲字符流实现文本文件高效读写,结合正则与字符串分割完成成绩数值解析,完整落地文件 IO 业务场景。

二、整体解题思路

1. 需求拆解

  1. 读取本地score.txt举重原始成绩文本,逐行处理;
  2. 提取每行文字中所有数字(支持小数成绩),自动累加计算总成绩;
  3. 原始文本拼接总成绩后控制台打印;
  4. 将处理后的完整数据追加写入新文件socreAnalysis.txt,多次运行不覆盖历史数据;
  5. 捕获 IO 读写异常,保证程序健壮性。

2. 分层实现思路

(1)数值解析层:Fenxi 工具类
  • 正则表达式[^0123456789.]匹配所有非数字、非小数点字符;
  • 将所有无关字符统一替换为分隔符*
  • 使用StringTokenizer按分隔符拆分纯数字字符串;
  • 循环转换为 double 类型累加,返回该行总成绩。
(2)文件 IO 业务层:AnalysisResult 主类
  • 底层文件流:FileReader读取源文件,FileWriter(file,true)开启追加模式输出;
  • 缓冲包装:用BufferedReaderBufferedWriter封装底层文件流,提供readLine()按行读取、newLine()换行等便捷方法;
  • 循环逐行读取文件,调用工具类计算总分,拼接文本后输出控制台 + 写入目标文件;
  • 流关闭:读写完成手动关闭缓冲流释放资源;
  • 异常捕获:捕获IOException打印异常信息,避免程序直接崩溃。

3. 填空逻辑推导(原题 4 处代码填空)

  1. 【代码 1】new FileWriter(fWrite, true):第二个参数 true 代表追加写入,满足题目追加要求;
  2. 【代码 2】new BufferedWriter(out):缓冲输出流必须接收 Writer 子类对象做底层流;
  3. 【代码 3】new FileReader(fRead):文件字符输入流,继承自 Reader 抽象类;
  4. 【代码 4】new BufferedReader(in):缓冲输入流包装 Reader,实现按行读取。

三、完整示例代码

1. Fenxi.java(数字解析工具类)

import java.util.*; public class Fenxi { public static double getTotalScore(String s) { //匹配所有非数字字符 String regex="[^0123456789.]"; String digitMess=s.replaceAll(regex,"*"); StringTokenizer fenxi = new StringTokenizer(digitMess,"*"); double totalScore=0; while(fenxi.hasMoreTokens()){ double score = Double.parseDouble(fenxi.nextToken()); totalScore = totalScore+score; } 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((str=bufferRead.readLine())!=null) { double totalScore=Fenxi.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.txt

4.运行结果

四、程序创新点

  1. 通用数字提取工具,解耦业务逻辑将数字提取、求和逻辑封装独立工具类Fenxi,和文件 IO 操作完全分离,后续任何文本数字统计场景可直接复用,符合单一职责设计思想。

  2. 兼容整数 / 小数成绩,修复原代码正则缺陷原题原始正则仅匹配纯数字,未包含小数点,会导致小数拆分错误;优化正则[^0123456789.]完美适配带小数点的举重成绩,覆盖真实业务数据。

  3. 追加写入模式,支持多次迭代统计使用FileWriter(file,true)开启文件追加,重复运行程序不会覆盖已有统计结果,适合分批录入成绩、持续汇总的使用场景。

  4. 缓冲流分层包装,兼顾性能与易用性底层使用基础文件流操作磁盘,上层缓冲流封装readLine()newLine()等便捷 API,相比原生单字符读写大幅提升大文本文件读写性能。

  5. 文本无关性解析,不限制文本格式无需固定文本分隔符,无论文字、符号如何混杂,均可自动过滤所有非数字内容提取分数,不局限于举重成绩单,可拓展到成绩单、账单、日志等数字提取场景。

五、实验心得体会

1. 技术知识点收获

  1. 分清字节流与字符流适用场景:处理中文文本文件优先使用Reader/Writer字符流,避免中文乱码;图片、视频等二进制文件才使用InputStream/OutputStream字节流。
  2. 缓冲流是 IO 优化核心:基础文件流单次读写效率极低,BufferedReader/BufferedWriter内置缓冲区,批量读写磁盘,处理多行文本必须使用。
  3. 文件追加写入关键:FileWriter第二个布尔参数控制覆盖 / 追加模式,日常日志、统计记录业务几乎都使用追加模式。
  4. 正则在文本清洗的实用价值:面对混杂文字和数字的不规则文本,正则可以快速过滤无关字符,简化数据提取流程,省去复杂字符串截取逻辑。
  5. IO 资源释放规范:文件流属于操作系统资源,使用完毕必须手动close()关闭,否则会占用文件句柄,导致文件无法修改、删除。

2. 踩坑总结

  1. 最初未注意正则缺失小数点,带小数成绩会解析报错,修正正则后程序才能正常运行;
  2. 忘记在写入文件后调用newLine(),所有输出内容会挤在同一行,可读性极差;
  3. 流关闭顺序错误:必须先关闭上层缓冲流,再关闭底层文件流,缓冲流关闭时会自动刷新缓冲区数据到磁盘;
  4. 未捕获 IO 异常直接编译报错,所有文件读写操作都属于受检异常,必须搭配try-catch或抛出异常。

3. 拓展思考

本次程序还有优化空间:可以使用 try-with-resources 语法自动关闭流,省去手动close();增加文件不存在判断,提前提示用户创建score.txt;封装配置文件名常量,方便修改文件路径;增加总分排序、平均分统计等拓展功能。通过本次 IO 实验,我理解了 Java 文件操作的分层设计思想,底层基础流负责硬件交互,上层装饰流拓展功能,这种装饰者模式也为后续学习 IO 高级用法打下基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 11:38:24

GetQzonehistory:一键智能备份QQ空间完整回忆的终极方案

GetQzonehistory:一键智能备份QQ空间完整回忆的终极方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益珍贵的今天,QQ空间承载着我们十余年的青春…

作者头像 李华
网站建设 2026/6/19 11:37:21

3分钟解锁虚拟显示魔法:ParsecVDD现代工作空间革命

3分钟解锁虚拟显示魔法:ParsecVDD现代工作空间革命 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 在数字工作空间日益复杂的今天,我们常常受限于物理显示…

作者头像 李华
网站建设 2026/6/19 11:36:22

三重护城河:基于433MHz方案的老人应急呼叫系统可靠性与抗干扰设计

明确了技术选型,下一步就是如何从工程层面构建牢不可破的可靠性。基于振浩微VM8806T发射芯片与RN532TS接收模块,我们可以为老人报警产品构筑三重防护。第一重:链路层抗干扰设计家用433MHz环境存在电磁干扰。为此,方案在链路层采用…

作者头像 李华
网站建设 2026/6/19 11:34:22

Bugly 自动修复:从问题发现到代码修复,AI 帮你走完最繁琐的路

崩溃治理长期困在"看不全、修不完"的循环里。Bugly 自动修复尝试打破这个循环:自动发现问题 自动修复问题,一体化闭环。 AI 圈定问题、分析根因、生成修复代码并提交 MR——开发者只需审核确认。一、崩溃治理的两大困境:发现不全&…

作者头像 李华
网站建设 2026/6/19 11:31:41

2026智能体决策平台选型:四代技术演进看白泽V5

先说结论如果你正在评估智能体决策平台,核心只看一件事:它属于第几代技术。白泽V5(思迈特软件旗下)代表当前的第四代——以"指标体系多智能体协同"双轮驱动,覆盖智能问数、归因分析、智能报告等六大场景闭环…

作者头像 李华