第 5 周:IO 流 + 文件持久化 + 项目收尾
本周目标
本周完成第一个能写进简历的 JavaSE 项目。完成后,应能够:
- 使用
File类完成文件与目录的创建、判断、遍历和删除 - 使用字节流、字符流和缓冲流完成文件读写
- 处理字符编码问题,正确读写 UTF-8 文本
- 使用对象序列化保存和恢复集合数据
- 使用
Properties读写配置文件 - 使用
try-with-resources保证资源正确释放 - 把内存版系统升级为数据可持久化的完整项目
学习资料与范围
- 主课程:Java 零基础视频教程(上部)
- 视频范围:P171-末尾(File、字符流、缓冲流、对象读写、综合案例)
| 视频范围 | 学习模块 | 学习结果 |
|---|---|---|
| P171-P178 | File 类、路径、目录遍历和文件信息 | 能够操作文件和目录 |
| P179-P187 | 字节流、字符流、编码与乱码处理 | 能够读写文本和二进制文件 |
| P188-P195 | 缓冲流、转换流、try-with-resources | 能够高效读写并正确释放资源 |
| P196-P203 | 对象序列化、对象流和 Properties | 能够保存对象和配置数据 |
| 末尾综合案例 | IO 与集合、面向对象结合的综合案例 | 能够把 IO 与集合、面向对象结合完成任务 |
分 P 范围为参考区间,实际以课程章节标题为准。
需要掌握的知识点
File
- 相对路径与绝对路径、路径分隔符
File对象的创建,以及它只是路径表示而不是文件本身- 创建文件、创建目录、删除文件和目录
- 判断文件是否存在、是否为目录、是否为文件
- 获取文件长度、名称、父路径和最后修改时间
- 遍历目录、按条件筛选文件、递归遍历子目录
- 删除目录失败的常见原因
字节流与字符流
- 输入流与输出流的区分
InputStream、OutputStream及其子类FileInputStream、FileOutputStreamReader、Writer及其子类FileReader、FileWriter- 字节流适合处理图片、音频等二进制数据
- 字符流适合处理文本,能按字符编码读写
- 一次读写一个字节/字符与一次读写一个数组的差异
- 文件不存在、路径错误、无写入权限时的异常表现
缓冲流与转换流
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter的作用- 缓冲流减少磁盘访问次数的原理
readLine()按行读取和newLine()换行InputStreamReader、OutputStreamWriter指定字符编码- 乱码产生的原因:读写编码不一致
try-with-resources的语法、执行流程和自动关闭条件flush()与close()的区别
对象序列化与配置
- 序列化的作用:把对象保存为字节数据
Serializable接口和序列化版本号的作用ObjectOutputStream、ObjectInputStream写入和读取对象- 一次写入集合对象、一次读回集合对象的做法
- 反序列化失败、类型不匹配和
EOFException的处理 Properties的加载、读取、设置和保存- 使用配置文件保存数据文件路径、文件名等可变信息
项目工程化
- 包结构的划分:
entity、dao、service、ui、util、exception - 数据访问层与业务逻辑层的职责边界
- 程序启动时加载数据、退出时保存数据
- 用户输入的校验与异常提示
- 使用
README说明项目功能、运行方式和数据存储格式 - 使用 Git 按功能拆分提交
必做练习
- File 基础:创建一个数据目录和空的
students.txt,输出文件是否存在、长度和绝对路径。 - 目录遍历:列出指定目录下的全部文件和子目录,只输出
.txt文件。 - 字节流复制:使用字节流复制一张图片,比较复制前后的文件大小。
- 字符流读写:使用字符流向文本文件写入 5 行内容,再逐行读取并输出。
- 乱码复现:分别用默认编码和指定编码读写同一个包含中文的文件,记录出现的乱码现象和修复方式。
- 缓冲流效率:分别使用普通字符流和缓冲流写入 10000 行文本,记录耗时差异。
- 按行处理:读取文件内容,统计总行数、总字符数和非空行数。
- 对象序列化:把
ArrayList<Student>写入文件,再读取回来,验证对象数量和属性一致。 - 配置文件:使用
Properties保存数据文件路径和系统名称,并在程序启动时读取。 - 资源释放:分别使用
try...finally和try-with-resources关闭流,说明后者的优势。 - 异常排查:故意读取一个不存在的文件,记录异常类型和异常信息,并给出友好提示。
本周综合任务:学生信息管理系统 JavaSE 版
在内存版基础上加入文件持久化,完成一个可反复运行、数据不丢失的完整项目。这是阶段二的验收交付版本,也是第 6-9 周 Maven 化、Stream 重构和 mini 框架化改造的基础。
功能要求
- 控制台菜单:新增、删除、修改、按学号查询、按姓名查询、查看全部、成绩统计、退出
- 使用
Student保存学号、姓名、性别、年龄、班级和三门课成绩 - 使用集合保存数据,使用
service层完成业务规则和数据校验 - 学号唯一,重复学号给出明确提示
- 支持按总分排序输出,支持输出各科平均分和及格率
持久化要求
- 程序启动时自动从数据文件加载数据
- 每次新增、删除、修改后保存数据到文件
- 至少实现一种文本格式(如 CSV)读写,并用对象序列化再实现一种
- 数据文件路径可以通过配置文件修改
- 文件不存在时自动创建,不因首次运行而报错
- 读取到格式错误的行时跳过并给出提示,不中断程序
结构要求
- 按
entity、dao、service、ui、util、exception分包 dao只负责数据读写,service负责业务规则,ui只负责交互- 异常统一处理,用户输入错误不会导致程序直接结束
- 关键方法添加注释,变量和类名表达实际用途
交付要求
- 使用 Git 管理开发过程,按功能拆分提交
- 编写
README,包含项目介绍、功能列表、目录结构、运行方式和数据文件说明 - 整理功能测试记录,覆盖正常流程和边界情况
Git 提交要求
本周至少通过独立提交体现以下开发步骤:
- 建立项目包结构和实体类
- 完成内存版增删改查
- 完成文件读写工具类
- 完成数据加载和保存
- 完成按条件查询和成绩统计
- 完成异常处理和输入校验
- 完成 README 和测试记录整理
本周产出
- IO 流基础练习代码
- 学生信息管理系统 JavaSE 版完整源码
- 文本格式数据文件和对象序列化文件各一份
- 项目 README
- 功能测试与边界测试记录
- 一份 IO 流、序列化和异常处理笔记
- 一份 1-5 周问题清单(作为第 9 周阶段复盘的材料)
完成检查
- 能够使用
File完成文件和目录操作 - 能够区分字节流和字符流的使用场景
- 能够使用缓冲流提高读写效率
- 能够定位并解决中文乱码问题
- 能够使用对象序列化保存和恢复集合数据
- 能够使用
try-with-resources正确释放资源 - 项目启动时加载数据,修改后保存数据
- 项目按分层包结构组织,职责边界清晰
- 已通过 Git 完成分功能提交
- 已完成 README 和测试记录