天天看点

Day60.数据流 -Java常用类、集合、IO#对象流

对象流

Day60.数据流 -Java常用类、集合、IO#对象流
Day60.数据流 -Java常用类、集合、IO#对象流
Day60.数据流 -Java常用类、集合、IO#对象流
/*
对象流的使用
1. ObjectInputStream 和 ObjectOutputStream
2. 作用: 用于存储和读取基本数据类型数据或对象的处理流。
        可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
3. 可序列号要求:
    见Person类

4. 序列化机制:
    运行把内存中的Java对象转行为二进制流,从而允许把这二进制流持久地保存在磁盘中,
    或是通过网络将二进制流传输到另一个网络节点。当其他程序获取到这个二进制流,
    就可以将它恢复成原来的Java对象。

 */
public class ObjectInputOutputStreamTest {

    /*
    序列号过程: 将内存中的Java对象保存在磁盘中或通过网络传输出去
    使用ObjectOutputStream实现
     */
    @Test
    public void testObjectOutputStream(){
        ObjectOutputStream oos = null;
        try {
            //1.
            oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
            //2.
            oos.writeObject(new String("我爱敲代码"));
            oos.flush();//刷新操作

            oos.writeObject(new Person("阿昌",21));
            oos.flush();//刷新操作

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null){
                try {
                    //3.
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /*
    反序列化过程: 将磁盘文件中的对象还原为内存中的Java对象
    使用ObjectInputStream实现
     */
    @Test
    public void testObjectInputStream(){
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.dat"));

            Object obj = ois.readObject();
            String str = (String)obj;

            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类

/*

Person类需要满足如下的要求,方可序列化
1. 需要实现接口: Serializable
2. 需要当前类提供一个全局常量: serialVersionUID
3. 除了当前Person类需要实现Serializable接口之外,还必须保证其内部的所有属性
   也必须是可序列号的。(默认情况下,基本数据类型都可序列化)

补充:ObjectInputStream 和 ObjectOutputStream不能序列化static和transient修饰的成员变量


 */
public class Person implements Serializable {

    public static final long serialVersionUID = 454613272L;

    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}