Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream相关的知识,希望对你有一定的参考价值。
Java 学习笔记 - IO篇:对象流 ObjectInputStream、ObjectOutputStream
ObjectOutputStream
ObjectOutputStream
:能将javaBean
对象(序列化)写入给定输出流
- 被写入的
javaBean
需要实现Serializable
接口。 对象输出流
的writeObject()
方法会尝试调用javaBean
中的writeObject(ObjectOutputStream out)
方法。- 在
javaBean
的writeObject(ObjectOutputStream out)
中可用out.putFields()
获取对象属性并设置。
ObjectInputStream
ObjectInputStream
:可以反序列化ObjectInputStream
输出的对象。对象输入流
的readObject()
方法会尝试调用javaBean
中的readObject(ObjectInputStream in)
方法。- 在
javaBean
的readObject(ObjectInputStream in)
中可用in.readFields()
获取原对象
属性并设置当前对象
属性。
序列化、反序列化
序列化 writeObject 将对象写入磁盘文件
@Test
public void ObjectOutputStreamTest()
HashMap<String, Object> map = new HashMap<>();
map.put("name","笨笨");
map.put("age",18);
map.put("equip", Arrays.asList("锅","碗","水瓢","盆"));
try(FileOutputStream fos = new FileOutputStream("e:\\\\test.data");
ObjectOutputStream oos = new ObjectOutputStream(fos))
oos.writeObject(map);
catch (IOException e) e.printStackTrace();
- 文件内容
反序列化 readObject 取出对象
@Test
public void ObjectInputStreamTest() throws Exception
try(FileInputStream fis = new FileInputStream("e:\\\\test.data");
ObjectInputStream ois = new ObjectInputStream(fis))
HashMap<String, Object> map = (HashMap)ois.readObject();
System.out.println(map);
catch (IOException e) e.printStackTrace();
输出:
equip=[锅, 碗, 水瓢, 盆], name=笨笨, age=18
自定义 Serializable 对象
writeObject、readObject
@Data
public class MyObject implements Serializable
private String name = "笨笨";
private Integer age = 18;
public class ObjectInputOutputStreamTest implements Serializable
@Test
public void OiosTest()
try (FileOutputStream fos = new FileOutputStream("e:\\\\test.data");
ObjectOutputStream oos = new ObjectOutputStream(fos))
oos.writeObject(new MyObject()); // 序列化
catch (IOException e) e.printStackTrace();
try (FileInputStream fis = new FileInputStream("e:\\\\test.data");
ObjectInputStream ois = new ObjectInputStream(fis))
System.out.println(ois.readObject()); // 反序列化
catch (Exception e) e.printStackTrace();
输出:
MyObject(name=笨笨, age=18)
putFields、readFields
上面是简单的版本,接下来我们重写一下对象中的 writeObject
、readObject
。
借助putFields、readFields
,读写
的时候还可以做些额外
的加工
。
@Data
public class MyObject implements Serializable
private String name = "笨笨";
private Integer age = 18;
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField("name", String.class),
new ObjectStreamField("age", Integer.TYPE)
;
private void writeObject(ObjectOutputStream out) throws Exception
ObjectOutputStream.PutField putField = out.putFields();
putField.put("name", "耀眼的笨笨");
putField.put("age", 999);
out.writeFields();
private void readObject(ObjectInputStream in) throws Exception
ObjectInputStream.GetField getField = in.readFields();
name = "★" + (String) getField.get("name", "无名");
age = getField.get("age", 100) + 1;
输出:
MyObject(name=★耀眼的笨笨, age=1000)
参考资料
Java 学习笔记 - IO篇:常见的【IO流Stream】以及相互关系
以上是关于Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream的主要内容,如果未能解决你的问题,请参考以下文章
Java 学习笔记 - IO篇:常见的IO流Stream以及相互关系