IO流之 对象操作流

2019-08-18  本文已影响0人  测试员

对象操作流

核心代码无变化,所以不做多余记录

什么是对象操作流

将对象进行序列化操作和反序列化操作的流,读出就是序列化,写入就是反序列化。

写出的用法:

(1)先要有个实体类并实现 Serializable 接口
(2)在测试类里:
//创建写出对象操作流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
//创建实体对象
Person p1 = new Person("yuan","18岁");
//将对象添加到目的地
oos.writeObject(p1);
//关闭流
oos.colse()

读入的用法:
    (1)直接在测试类里:
        //创建对象操作流对象
        ObjectInputStream ois =new ObjectInputStream(new FileInputStream("a.txt"));
        //打印读到的内容
        System.out.println(ois.readObject());//该方法,读一条定将指针下移
灵魂3问:

1.修改序列化对象文件会出问题吗

类的串行版本与从流中读取的类描述符的类型不匹配
该类包含未知的数据类型
该类没有可访问的无参数构造函数
这三种情况会抛出InvalidClassException

2.如何解决

添加 private static final long serialVersionUID = 31234L;

3.有不想被序列化的成员变量怎么处理

给该成员变量添加 transient 关键字修饰

优化的思路:
    (1)写入的时候:
        1)把要写入的实体对象创建好。
        2)把创建好的实体对象放到一个集合里。
        2)把这个集合写出到文件。
    (2)读出的时候:
        1)读取集合。
        用增强for遍历,并读出。

例子

    package com.yuan.io.learn;
    
    import java.io.*;
    
    public class 对象操作流 {
        public static void main(String[] args) {
            try (
                    //对象反序列化流
                    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Object.txt"));
                    //对象序列化流
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Object.txt"))
            ) {
                Person people_1 = new Person("图图", 23);
                Person people_2 = new Person("兮兮", 23);
                //这样就将数据写到了文件中,注意!虽然看不懂文件内容但没关系。用反序列化写出来就OK!
                oos.writeObject(people_1);
                oos.writeObject(people_2);
    
                //用反序列化写出来[这里如果要用循环 只能添加到集合里]
                final Object peop1 = ois.readObject();
                System.out.println("peop1 = " + peop1);
                final Object peop2 = ois.readObject();
                System.out.println("peop2 = " + peop2);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读