JavaIO流之对象流

IO流中的对象流

  1. ObjectInputStream 和 ObjectOutputStream
  2. 作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
  3. 要想一个java对象是可序列化的,需要满足相应的要求。
    XX类需要满足如下的要求,方可序列化
  • 需要实现接口:Serializable (是一个标识接口,其中没有抽象方法)
  • 当前类提供一个全局常量:serialVersionUID
  • 除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)
  • 补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
  1. 序列化机制:
  • 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种
  • 二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。
  • 当其它程序获取了这种二进制流,就可以恢复成原来的Java对象

序列化过程

将内存中的java对象保存到磁盘中或通过网络传输出去。
使用ObjectOutputStream实现
测试代码:

    @Test
    public void testObjectOS(){
        ObjectOutputStream oos = null;
        try {
            //1.造流
            oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
            //2.将对象写入文件
            oos.writeObject(new String("唯独你没懂"));
            oos.flush();
            oos.writeObject(new Person("zyj",23));
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //3.
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

反序列化

将磁盘文件中的对象还原为内存中的一个java对象。
使用ObjectInputStream来实现
测试代码:

    @Test
    public void testObjectIS(){
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.dat"));
            Object o = ois.readObject();
            String str = (String) o;
            Person p = (Person) ois.readObject();
            System.out.println(str);
            System.out.println(p);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

上述测试中所使用到的Person类:

public class Person implements Serializable {
    public static final long serialVersionUID = 4148615616546546512L;
    private String name;
    private int age;

    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    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;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
posted @ 2021-06-29 18:28  koito  阅读(52)  评论(0编辑  收藏  举报