当前位置: 首页 > article >正文

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. 序列化具有可继承性,如果父类实现了序列化接口,其所有子类也默认实现了序列化接口


http://www.kler.cn/news/340853.html

相关文章:

  • 基于hadoop和springboot的高校固定资产管理系统的设计与实现
  • 搭建企业域名服务器案例
  • 【VUE】虚拟DOM真的比真实DOM性能好吗
  • 【FastAdmin】全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架
  • spark的rdd介绍和应用
  • 图像处理(一)——CMC特刊推荐
  • Win11 23H2 10月正式版:22631.4317 镜像免费下载!
  • C++进阶——哈希
  • springboot-网站开发-如何规避和拒绝用户输入的空字符串
  • 深入解析 Baichuan 模型:架构、训练与实际应用
  • 门窗对象检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • Spring Boot教学资源大全:开启你的Spring之旅
  • Git进行版本控制操作流程
  • ubuntu18.04系统中图形化界面
  • ClickHouse之更新表(ReplicatedReplacingMergeTree)
  • 【React】入门Day04 —— 项目搭建及登录与表单校验、token 管理、路由鉴权实现
  • 笔记本电脑重启输入密码后黑屏
  • 【hot100-java】二叉树中的最大路径和
  • 新赚米渠道,天工AI之天工宝典!
  • %pip和!pip的区别