本文已参与「新人创作礼」活动,一起开启掘金创作之路
目标
- 以二进制格式保存
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