自学内容网 自学内容网

Java重修笔记 第六十三天 坦克大战(十三)IO 流 - ObjectInputStream 和 ObjectOutputStream、对处理流的细节整理

  • ObjectInputStream 类的常用方法
 1. 写入字符串

        public void writeUTF(String str) throws IOException

        参数:str - 要写入的字符串

2. 序列化一个对象

        public final void writeObject(Object obj) throws IOException

        参数:obj - 要写入的对象

        说明:此对象应实现 Serializable 或 Externalizable 接口

3. 关闭流

        public void close() throws IOException

        说明:必须 close 关闭或者 flush 刷新,否则写入不到指定文件

public class ObjectOutputStream01 {
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\data.dat";

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
        // 存放数据, 序列化数据到文件中
        oos.writeInt(100);
        oos.writeBoolean(true);
        oos.writeChar('a');
        oos.writeDouble(12.5);
        oos.writeUTF("韩顺平教育");
        // 保存对象
        oos.writeObject(new Dog("小黄", 2));
        // 关闭流
        oos.close();
        System.out.println("序列化完成");
    }
}

class Dog implements Serializable {
    private String name;
    private int age;

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

  • ObjectOutputStream 类的常用方法
1. 读取对象

        public final Object readObject() throws IOException, ClassNotFoundException

        返回值:返回读取到的 Object 对象

        异常:ClassNotFoundException - 无法找到序列化对象的类

                   InvalidClassException - 类的序列化版本与从流中读取的类描述符的类型不匹配,或者在加载序列化类的过程中找不到该类

                   OptionalDataException - 没有读取完前面的元素,或者前面的元素使用的readXXX方法读错了原始数据

        说明:反序列化读取顺序,必须和序列化顺序一致,如果要调用该类的特有方法需要获得该类的定义,并向下转型。(要么引入包,要么将该类设置为 public 公有的)

2. 关闭流

        public void close() throws IOException

public class ObjectInputStream01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String filePath = "d:\\data.dat";
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        // 反序列化的顺序 必须和序列化的顺序一致
        // 存放数据, 序列化数据到文件中
        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readChar());
        System.out.println(ois.readDouble());
        System.out.println(ois.readUTF());
        // 读取保存对象
        System.out.println(ois.readObject());
        // 关闭流
        ois.close();
        System.out.println("反序列化完成");
    }
}

  • 对处理流的细节

1. 序列化对象必须要实现 Serializable 或者 externalizable

2. 文件读写顺序要一致,若不一致会报 OptionalDataException 异常

3. 序列化的类中建议添加一个 SerialVersionUID,可以提高版本兼容性

4. static 和 transient 关键字修饰的方法和属性不会被序列化,用于保护一些敏感的信息

5. 序列化对象时,该对象的所有属性也都必须实现序列化接口,除了static 和 transient

6. 序列化具有可继承性,如果父类实现了序列化接口,其所有子类也默认实现了序列化接口


原文地址:https://blog.csdn.net/Code___slave/article/details/142773136

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!