文章目录
- 一、实验目的
- 二、实验过程
- 三、实验结果分析
- 四、实验小结
(必做)PIM with I/O:改写基于命令行形式的个人信息管理(PIMCmd)程序,要求如下:
- 将第5章实验内容2中的数据存储形式改为文件就行持久存储。
- 保持命令行交互命令格式不变。
- 按需要可适当改写原有实现。
一、实验目的
- 熟悉 File 对象的创建、文件名和目录操作,文件信息的获取与测试;
- 掌握典型的流式输入输出(文件流、缓存流、数据流、标准输入输出流),典型的流接口的使用。
- 了解 java.util.Scanner 类以及输入输出的重定向方法。
- 掌握对象序列化的一般方法,以及可序列化类的定义方法。
二、实验过程
- 实验环境
操作系统:Windows 11
集成开发环境:Eclipse IDE for Enterprise Java and Web Developers (includes
Incubating components) 2022-03 (4.23.0) - 题目分析
个人信息管理程序通过命令行形式实现四种功能:List(打印所有的 PIM 对象)、Create(添加一个新的 PIM 对象)、Save(保存整个 PIM 对象列表到文件)、Load(从存储中读取整个 PIM 对象列表)。本次实验要求实现后面两种功能,在以前的个人信息管理程序中添加持久存储功能。之前是将数据保存在内存中的,这样一旦断电,数据就会全部消失,为了能在重启之后依然保留原来的数据,需要将其持久化存储在磁盘中。
根据题目提示,我没有选择利用 PIMEntity 对象中的 fromString 方法解析字符串、利用 toString 方法生成并将字符串保存到文件中,而是创建可序列化的对象、并使用对象输入输出流来实现对象的持久化存储。 - 代码实现
为了让一个对象能够序列化、串行化、永久化,我们必须为对象实现 Serializable 接口(该接口仅为标记接口,不包含任何方法定义)。因此,让抽象父类 PIMEntity 实现 Serializable 接口,这样其子类 PIMContact、PIMAppointment、PIMTodo 和 PIMNote 也可以被序列化:
之前在操作类 PIMManager 中,我定义了一个用来保存 PIMEntity 对象数据的字符串数组 itemList。现在,由于打算使用对象输入输出流来进行对象持久化,这里改为 PIMEntity 对象数组,并在 saveData 方法中将对象数组保存到文件中:
完成了对象集合的保存后,再次启动程序时,需要将对象集合重新反序列化,从文件中提取对象数据。具体的 saveData 方法如下所示:
程序主类 PIMManager 的 main 方法中,只是稍作修改:
输入 Save 和 Load 命令时,调用相关方法,完成对象的序列化和反序列化:
三、实验结果分析
完成程序编写后,在 Eclipse 中点击 Run,输入如下信息:
……最后输入 Save 命令,用来持久化 PIMEntity 对象集合。再次点击 Run,运行程序。发现之前输入的信息完整保存了下来……用记事本打开 PIMDatabase.dat,看到的是一片乱码:……
可见,实验结果是正确的。
四、实验小结
本次实验学习了对象序列化和反序列化的相关操作,这部分内容是我之前不是很明白的,为此我还把《Java 核心技术卷 II》第 2 章输入与输出仔细看了一遍,自我感觉获益良多,尤其是对 ObjectInputStream 类的使用。