Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream相关的知识,希望对你有一定的参考价值。

Java 学习笔记 - IO篇:对象流 ObjectInputStream、ObjectOutputStream

ObjectOutputStream

  1. ObjectOutputStream:能将 javaBean对象(序列化)写入给定输出流
  2. 被写入的 javaBean 需要实现Serializable 接口。
  3. 对象输出流writeObject() 方法会尝试调用 javaBean 中的 writeObject(ObjectOutputStream out) 方法。
  4. javaBeanwriteObject(ObjectOutputStream out) 中可用 out.putFields()获取对象属性并设置。

ObjectInputStream

  1. ObjectInputStream:可以反序列化 ObjectInputStream 输出的对象。
  2. 对象输入流readObject() 方法会尝试调用 javaBean 中的 readObject(ObjectInputStream in) 方法。
  3. javaBeanreadObject(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

上面是简单的版本,接下来我们重写一下对象中的 writeObjectreadObject
借助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以及相互关系

Java 学习笔记 - IO篇:常见的流Stream通道Channl以及相互关系

Java IO学习笔记对象流

Java 学习笔记 - IO篇:读写文本文件txt

Java学习笔记之:Java 流

Java IO学习笔记