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

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

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

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

Java 学习笔记 - IO篇:对象流 ObjectInputStream、ObjectOutputStream
  • ObjectOutputStream
  • ObjectInputStream
  • 序列化、反序列化
    • 序列化 writeObject 将对象写入磁盘文件
    • 反序列化 readObject 取出对象
  • 自定义 Serializable 对象
    • writeObject、readObject
    • putFields、readFields
  • 参考资料

ObjectOutputStream
  1. ObjectOutputStream:能将 javaBean对象(序列化)写入给定输出流
  2. 被写入的 javaBean 需要实现Serializable 接口。
  3. 对象输出流 的 writeObject() 方法会尝试调用 javaBean 中的 writeObject(ObjectOutputStream out) 方法。
  4. 在 javaBean 的 writeObject(ObjectOutputStream out) 中可用 out.putFields()获取对象属性并设置。
ObjectInputStream
  1. ObjectInputStream:可以反序列化 ObjectInputStream 输出的对象。
  2. 对象输入流 的 readObject() 方法会尝试调用 javaBean 中的 readObject(ObjectInputStream in) 方法。
  3. 在 javaBean 的 readObject(ObjectInputStream in) 中可用 in.readFields()获取原对象属性并设置当前对象属性。
序列化、反序列化 序列化 writeObject 将对象写入磁盘文件
@Test
public void ObjectOutputStreamTest(){
    HashMap 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 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】以及相互关系

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

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

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