栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

    大家好,这期我来讲解一下序列化和反序列化的完整实现过程,解决大家遇到的各种异常问题,例如: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);
        
        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)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 list = null;
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerialiUtil su = new SerialiUtil();
        System.out.println("-----读取文件对象到list集合中-----");
        su.readFile();
        System.out.println("-----读取成功!-----nn");
        if(list == null){
            System.out.println("文件中没有对象信息!!!");
            list = new ArrayList();  //创建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你的关注哦~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/274736.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号