大家好,这期我来讲解一下序列化和反序列化的完整实现过程,解决大家遇到的各种异常问题,例如:FileNotFoundException、java.io.EOFException等问题
基本实现步骤:
1.创建文件对象(File),并判断文件是否存在,不存在则利用createNewFile()方法创建
2.创建FileInputStream/FileOutputStream对象,并判断文件是否为空操作,避免出现java.io.EOFException异常
3.让基本类对象实现Serializable接口
4.创建对象输入/输出流对象,并进行序列化和反序列化操作
代码实现:
1.SerialiUtil工具类
这是我们实现序列化和反序列化的核心类,含括基本实现步骤的1、2、4步
package utils;
import moudle.Test;
import moudle.Teacher;
import java.io.*;
import java.util.ArrayList;
public class SerialiUtil {
String filePath = null;
File file = null;
FileInputStream fis = null;
FileOutputStream fos = null;
ObjectInputStream ois = null;
ObjectOutputStream oop = null;
/*
初始化文件参数
*/
{
//构造代码块
try {
filePath = new File("").getCanonicalPath() + "/1.txt"; //getCanonicalPath()表示获取当前项目路径
} catch (IOException ioException) {
ioException.printStackTrace();
}
file = new File(filePath);
/*
如果文件不存在,则创建文件。因为如果文件不存在,FileInputStream对象不会给我们自动地创建文件
*/
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
//在指定的文件中获取对象
public void readFile() throws IOException, ClassNotFoundException {
fis = new FileInputStream(file);
//如果不判断文件是否为空,控制台会抛出一个java.io.EOFException异常,这也是小伙伴的经常会出现的一个问题
if(fis.getChannel().size() == 0){
return; //文件为空,直接退出
}else{
ois = new ObjectInputStream(fis);
//readOject()方法会返回一个Oject对象,我们需要强制类型转换成我们想要的对象类型
Test.list = (ArrayList<Teacher>)ois.readObject();
}
fis.close(); //释放资源
}
//将我们的对象存储到文件中
public void writeToFile() throws IOException {
//判断集合对象是否为空并且集合是否为空,都不为空我们才把对象写入文件,避免下一次读取出错
if(Test.list == null || !Test.list.isEmpty()){
return;
}
fos = new FileOutputStream(file);
oop = new ObjectOutputStream(fos);
oop.writeObject(Test.list); //将对象写入文件中
//释放资源
oop.close();
}
}
2.Teacher基本类
Teacher基本类一定要实现Serializable接口,否则无法实现序列化和反序列化操作
package moudle;
import java.io.Serializable;
public class Teacher implements Serializable {
private int tid; //教师编号(账号)
private String name; //教师姓名
private String password; //登录密码
public Teacher(int tid, String name, String password) {
this.tid = tid;
this.name = name;
this.password = password;
}
public void setTid(int tid) {
this.tid = tid;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public int getTid() {
return tid;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "Teacher{" +
"教师编号=" + tid +
", 教师姓名='" + name + '\'' +
", 登录密码='" + password + '\'' +
'}';
}
}
3.Test测试类
Test测试类用于调用SerialiUtil工具类对象的readFile()和writeToFile()方法,即实现序列化和反序列化。在中间可以对list集合添加元素,来测试实验是否成功
package moudle;
import utils.SerialiUtil;
import java.io.IOException;
import java.util.ArrayList;
public class Test {
public static ArrayList<Teacher> list = null;
public static void main(String[] args) throws IOException, ClassNotFoundException {
SerialiUtil su = new SerialiUtil();
System.out.println("-----读取文件对象到list集合中-----");
su.readFile();
System.out.println("-----读取成功!-----\n\n");
if(list == null){
System.out.println("文件中没有对象信息!!!");
list = new ArrayList<Teacher>(); //创建list对象
list.add(new Teacher(11,"汤姆","123")); //向list集合中添加元素
}else{
System.out.println("文件中有对象信息,信息如下:");
System.out.println(list.toString());
}
System.out.println("-----将list对象保存到文件中-----");
su.writeToFile();
System.out.println("-----保存到文件成功!-----");
}
}
第一次运行Test类,我们的项目下就会多出一个1.txt,因为是程序自动给我们创建的文本,所以第一次文件肯定是为空的,这符合我们的期望。希望小伙伴多注意这一点

第二次执行Test类,这次小伙伴们可以猜想以下控制台会输出什么
结果如下:

这里我们发现,程序自动给我们检测出文件是否为空,进一步优化了程序,避免了出现空指针异常的情况。
在这里我就不啰嗦太多了,代码里面都有注释,大家可以认真去看一下就会理解很多,不懂的可以评论区留言或者私信我哦!!
我是带风的poss哥,wait你的关注哦~
本文详细讲解了如何在Java中实现序列化与反序列化,涵盖文件操作、异常处理和基本类的Serializable接口使用。通过实例演示,教你如何创建工具类、处理FileNotFoundException和EOFException,确保数据安全存储与读取。
598

被折叠的 条评论
为什么被折叠?



