Java IO流03:对象字节流

对象字节流,使用流传输对象,该过程称为序列化\反序列化

对象字节流的特点:

  • 拥有缓冲区
  • 可以读写八大基本数据类型和字符串
  • 可以读写对象

ObjectOutputStream子类

通过writeObject()方法向流中写入一个对象,这个过程称为序列化

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Main{

    public static void main(String[] args) throws Exception {

        FileOutputStream file1 = new FileOutputStream("d:\\out.bin");
        FileOutputStream file2 = new FileOutputStream("d:\\out.bin");

        /**
         * 创建对象输出流,将一个字节输出流作为参数
         */
        ObjectOutputStream oo1 = new ObjectOutputStream(file1);
        ObjectOutputStream oo2 = new ObjectOutputStream(file2);

        /**
         * 序列化,写入一个对象
         */
        Test test = new Test("ty", 25);
        oo1.writeObject(test);

        /**
         * 序列化写入多个对象,可以将对象添加进集合
         */
        ArrayList<Test> list = new ArrayList<>();

        Test test1 = new Test("ty", 25);
        Test test2 = new Test("tao", 26);

        list.add(test1);
        list.add(test2);

        oo2.writeObject(list);

        /**
         * 关闭输出流
         */
        oo1.close();
        oo2.close();
    }
}

/**
 * 自定义类的对象想要进行流的输出,必须要实现Serializable序列化接口,如果对象有属性是由类生成的,这个类也要实现接口
 */
class Test implements Serializable{

    String name;

    /**
     * 使用transient和static关键字修饰属性,这个属性就不会被序列化
     */
    transient int age;

    public Test(String name, int age) {

        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {

        return "Test{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

ObjectInputStream子类

通过readObject()方法从流中读取一个对象,这个过程称为反序列化

注意:读入对象的程序中,不能修改原来类的代码,否则序列化版本ID发生改变,将会无法识别

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Main{

    public static void main(String[] args) throws Exception {

        /**
         * 创建字节输入流,传入之前序列化过的文件
         */
        FileInputStream file1 = new FileInputStream("d:\\out.bin");
        FileInputStream file2 = new FileInputStream("d:\\out.bin");

        /**
         * 创建对象输入流,将有序列化文件的字节输入流作为参数
         */
        ObjectInputStream oi1 = new ObjectInputStream(file1);
        ObjectInputStream oi2 = new ObjectInputStream(file2);

        /**
         * 反序列化,读入一个对象
         */
        Test test = (Test) oi1.readObject();

        /**
         * 反序列化多个对象,对集合操作
         */
        ArrayList<Test> list = (ArrayList) oi2.readObject();

        /**
         * 关闭输入流
         */
        oi1.close();
        oi2.close();

        System.out.println(test.toString());
        System.out.println(list.toString());
    }
}

/**
 * 类的代码不能发生任何改变,否则无法识别
 */
class Test implements Serializable{

    String name;
    transient int age;

    public Test(String name, int age) {

        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {

        return "Test{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
posted @ 2021-09-12 17:13  振袖秋枫问红叶  阅读(176)  评论(0)    收藏  举报