• 【Java】对象处理流(ObjectOutputStream和ObjectInputStream)


    1.基本介绍

    1. 功能,提供了对基本类型或对象类型的序列化和反序列化的方法。
    2. ObjectOutputStream提供序列化功能。
    3. ObjectInputStream提供反序列化功能。

    2.ObjectOutputStream序列化

    1.ObjectOutputStream_.java

    1. //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
    package com.outputstream;
    import java.io.*;
    
    /**
     * @version 1.0
     * @auther Demo龙
     *  演示ObjectOutputStream的使用, 完成数据的序列化
     */
    public class ObjectOutputStream_ {
        public static void main(String[] args) throws IOException {
            //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
            String filePath = "e:\\data.dat";
    
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
    
            //序列化数据到 e:\data.dat
            oos.writeInt(100);// int -> Integer (实现了 Serializable)
            oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
            oos.writeChar('a');// char -> Character (实现了 Serializable)
            oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
            oos.writeUTF("Demo龙龙咯嘛");//String
            //保存一个dog对象
            oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
            oos.close();
            System.out.println("数据保存完毕(序列化形式)");
    
    
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2.Master.java

    package com.outputstream;
    
    import java.io.Serializable;
    
    /**
     * @version 1.0
     * @auther Demo龙
     */
    public class Master implements Serializable {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.Dog.java

    1. //序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
    2. //序列化对象时,要求里面属性的类型也需要实现序列化接口
    3. //serialVersionUID 序列化的版本号,可以提高兼容性
    package com.outputstream;
    
    import java.io.Serializable;
    
    /**
     * @version 1.0
     * @auther Demo龙
     */
    public class Dog implements Serializable {
            private String name;
            private int age;
            //序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
            private static String nation;
            private transient String color;
            //序列化对象时,要求里面属性的类型也需要实现序列化接口
            private Master master = new Master();
    
            //serialVersionUID 序列化的版本号,可以提高兼容性
            private static final long serialVersionUID = 1L;
    
            public Dog(String name, int age, String nation, String color) {
                this.name = name;
                this.age = age;
                this.color = color;
                this.nation = nation;
            }
    
            @Override
            public String toString() {
                return "Dog{" +
                        "name='" + name + '\'' +
                        ", age=" + age +
                        ", color='" + color + '\'' +
                        '}' + nation + " " +master;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    演示结果 在这里插入图片描述

    3.ObjectInputStream反序列化

    1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致,否则会出现异常。
    2. 如果我们希望调用Dog的方法, 需要向下转型.。
    3. dog 的编译类型是 Object , dog 的运行类型是 Dog.。
    4. 需要我们将Dog类的定义,放在到可以引用的位置。
    package com.inputstream;
    
    import com.outputstream.Dog;
    
    import java.io.*;
    /**
     * @version 1.0
     * @auther Demo龙
     */
    public class ObjectInputStream_ {
        public static void main(String[] args) throws Exception {
            //指定反序列化的文件
            String filePath = "e:\\data.dat";
    
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
    
            //读取
            //1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
            //2. 否则会出现异常
    
            System.out.println(ois.readInt());
            System.out.println(ois.readBoolean());
    
            System.out.println(ois.readChar());
            System.out.println(ois.readDouble());
            System.out.println(ois.readUTF());
    
    
            //dog 的编译类型是 Object , dog 的运行类型是 Dog
            Object dog = ois.readObject();
            System.out.println("运行类型=" + dog.getClass());
            System.out.println("dog信息=" + dog);//底层 Object -> Dog
    
            //1. 如果我们希望调用Dog的方法, 需要向下转型
            //2. 需要我们将Dog类的定义,放在到可以引用的位置
            Dog dog2 = (Dog)dog;
            System.out.println(dog2.getName()); //旺财..
    
            //关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流
            ois.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    演示结果 在这里插入图片描述

  • 相关阅读:
    iOS调用文件app(file.app)选择文件和下载
    windows用脚本编译qt的项目
    【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准
    学习笔记7--系统功能与信息安全概述
    C/C++条件编译:#ifdef、#else、#endif等
    Django templates 存放html目录
    数据结构day34
    web课程设计网页规划与设计 html+css+javascript+jquery+bootstarp响应式游戏网站Bootstrap模板(24页)
    微服务技术栈-Gateway服务网关
    Shell第四章《正则表达式》
  • 原文地址:https://blog.csdn.net/qq_59708493/article/details/126219125