java序列化与反序列化工具类实现(含讲解与注意事项)

本文详细讲解了如何在Java中实现序列化与反序列化,涵盖文件操作、异常处理和基本类的Serializable接口使用。通过实例演示,教你如何创建工具类、处理FileNotFoundException和EOFException,确保数据安全存储与读取。

    大家好,这期我来讲解一下序列化和反序列化的完整实现过程,解决大家遇到的各种异常问题,例如: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你的关注哦~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值