对象流的使用

1. 数据流及其作用(了解)

DataOutputStream:可以将内存中的基本数据类型的变量、String类型的变量写出到具体的文件中。
DataInputStream:将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量。


2. 对象流及其作用
2.1 API:
ObjectInputSteam
ObjectOutputStream

2.2 作用:
可以读写基本数据类型的变量、引用数据类型的变量。

3. 对象的序列化机制是什么
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,
或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。


4.如下两个过程使用的流:
序列化过程:(写的过程)使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去

反序列化过程:(读的过程)使用ObjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象


5.自定义类要想实现序列化机制,需要满足:
① 自定义类需要实现接口:Serializable
② 要求自定义类声明一个全局常量: static final long serialVersionUID = 42234234L;
   用来唯一的标识当前的类。
③ 要求自定义类的各个属性也必须是可序列化的。
   > 对于基本数据类型的属性:默认就是可以序列化的
   > 对于引用数据类型的属性:要求实现Serializable接口


6.注意点:
① 如果不声明全局常量serialVersionUID,系统会自动声明生成一个针对于当前类的serialVersionUID。
如果修改此类的话,会导致serialVersionUID变化,进而导致反序列化时,出现InvalidClassException异常。
② 类中的属性如果声明为transient或static,则不会实现序列化。

代码
package chapter15_io_teacher.src.com.atguigu05.objectstream;

import org.junit.Test;

import java.io.*;

/**
 * ClassName: ObjectInputOutputStreamTest
 * Description:
 *
 * @Author 尚硅谷-宋红康
 * @Create 14:28
 * @Version 1.0
 */
public class ObjectInputOutputStreamTest {
    /*
    * 序列化过程:使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或通过网络传输出去
    * */
    @Test
    public void test1() throws IOException {
        //1.
        File file = new File("object.txt");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

        //2.写出数据即为序列化的过程
        oos.writeUTF("江山如此多娇,引无数英雄竞折腰");
        oos.flush();

        oos.writeObject("轻轻的我走了,正如我轻轻的来");
        oos.flush();


        oos.close();
    }

    /*
    * 反序列化过程:使用ObjectInputSteam流实现。将文件中的数据或网络传输过来的数据还原为内存中的Java对象
    * */
    @Test
    public void test2() throws IOException, ClassNotFoundException {
        //1.
        File file = new File("object.txt");

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));


        //2. 读取文件中的对象(或反序列化的过程)
        String str1 = ois.readUTF();
        System.out.println(str1);

        String str2 = (String) ois.readObject();
        System.out.println(str2);

        //3.
        ois.close();
    }

    //演示自定义类的对象的序列化和反序列化过程
    //序列化过程:
    @Test
    public void test3() throws IOException {
        //1.
        File file = new File("object1.dat");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

        //2.写出数据即为序列化的过程
        Person p1 = new Person("Tom",12);
        oos.writeObject(p1);
        oos.flush();

        Person p2 = new Person("Jerry",23,1001,new Account(2000));
        oos.writeObject(p2);
        oos.flush();

        //3.
        oos.close();
    }

    //反序列化过程:
    @Test
    public void test4() throws IOException, ClassNotFoundException {
        //1.
        File file = new File("object1.dat");

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));


        //2. 读取文件中的对象(或反序列化的过程)
        Person person = (Person) ois.readObject();
        System.out.println(person);


       Person person1 = (Person) ois.readObject();
        System.out.println(person1);

        //3.
        ois.close();
    }

}

package chapter15_io_teacher.src.com.atguigu05.objectstream;

import java.io.Serializable;

/**
 * ClassName: Person
 * Description:
 *
 * @Author 尚硅谷-宋红康
 * @Create 14:36
 * @Version 1.0
 */
public class Person implements Serializable { //Serializable:属于一个标识接口
    String name;
    int age;

    int id;

    Account acct;

    static final long serialVersionUID = 422334254234L;

    public Person() {
    }

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

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

    public Person(String name, int age, int id, Account acct) {
        this.name = name;
        this.age = age;
        this.id = id;
        this.acct = acct;
    }

    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;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

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


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


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

class Account implements Serializable{
    double balance;

    static final long serialVersionUID = 422234L;

    public Account(double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "balance=" + balance +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值