以二进制格式保存加载java对象

233 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

目标

  • 以二进制格式保存java对象为文件
  • 加载保存的二进制文件,转为需要的对象

代码片段

模型类

  • 年级 Grade.java
package com.xzbd.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author sun @ 2021/10/27
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Grade implements Serializable {
    private String name;
    private String level;
}


  • 学校 School.java
package com.xzbd.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

/**
 * @author sun @ 2021/10/27
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class School implements Serializable {
    private String name;
    private String address;
    private List<Grade> gradeList;
}

  • 工具类 IOUtil.java
package com.xzbd.demo;

import java.io.*;
import java.util.Objects;

/**
 * @author sun @ 2021/10/27
 */
public class IOUtil {

    /**
     * save file from object as binary format
     * <p>
     * 以二进制的形式将对象保存为文件
     * </P>
     * <p>
     * <code>obj</code> 必须实现 <code>Serializable</code>接口
     * </p>
     *
     * @param fullPath
     * @param obj      自定义对象
     */
    public static void saveBinaryFileFromObject(String fullPath, Object obj) {
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            // 读取对象并转换成二进制数据
            oos.writeObject(obj);
            oos.flush();
            File destFile = new File(fullPath);
            if(!destFile.exists()){
                destFile.createNewFile();
            }
            bos.writeTo(new FileOutputStream(destFile));
            bos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将文件装载为模型
     *
     * @param <T>      目标模型
     * @return
     * @throws Exception
     */
    public static <T> T loadModelFromFile(String fileName, Class<T> tClazz) {
        try {
            File file = new File(fileName);
            InputStream inStream = new FileInputStream(file);
            return loadModelFromStream(inStream, tClazz);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将模型流转为模型
     *
     * @param <T>      目标模型
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static <T> T loadModelFromStream(InputStream inStream, Class<T> tClazz) {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(inStream);
            Object obj = ois.readObject();
            if (obj.getClass() == tClazz) {
                return (T) obj;
            } else {
                System.out.println("######### 加载文件转对象失败 #########");
                System.out.println("系统加载到的文件是:" + obj.getClass() + " 对象");
                System.out.println("您希望的对象是:" + tClazz + " 对象");
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (Objects.nonNull(ois)) {
                try {
                    ois.close();
                    inStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
    }
}

  • 测试类 Test.java
package com.xzbd.demo;

import java.util.ArrayList;
import java.util.List;

/**
 * @author sun @ 2021/10/27
 */
public class Test {

    public static void main(String[] args) {
        Grade grade1 = new Grade("一年级","1");
        Grade grade2 = new Grade("二年级","2");
        Grade grade3 = new Grade("三年级","3");
        Grade grade4 = new Grade("四年级","4");

        List<Grade> gradeList = new ArrayList<>();
        gradeList.add(grade1);
        gradeList.add(grade2);
        gradeList.add(grade3);


        List<Grade> gradeList2 = new ArrayList<>();
        gradeList2.add(grade2);
        gradeList2.add(grade3);
        gradeList2.add(grade4);

        School school = new School("小学","小学的地址",gradeList);
        School school2 = new School("大学","大学的地址",gradeList2);


        String file1 = "D:\\z_tmp_data/school1";
        String file2 = "D:\\z_tmp_data/school2";
        IOUtil.saveBinaryFileFromObject(file1,school);
        IOUtil.saveBinaryFileFromObject(file2,school2);

        School loadModelFromFile = IOUtil.loadModelFromFile(file1, School.class);
        School loadModelFromFile2 = IOUtil.loadModelFromFile(file2, School.class);

        System.out.println(loadModelFromFile.toString());
        System.out.println(loadModelFromFile2.toString());

    }
}

运行结果

  • 输出的文件 在这里插入图片描述

  • 加载回的数据,打印 在这里插入图片描述

用到的工具类

  • lombok