Java 对象处理流(ObjectOutputStream\ObjectInputStream)

news2024/10/6 18:23:48

文章目录

  • 前言
  • 什么是对象流?
  • 基本介绍
  • ObjectOutputStream
  • ObjectInputStream
  • 对象处理流的使用细节

前言

处理流:是对一个已存在的流进行处理和封装,通过所封装的流的功能调用实现对数据的操作。而处理流中也有不同的分类,此片介绍的是处理流中的对象流。

如果对处理流流有疑问,可查看此博客或自行百度!
Java之节点流和处理流


什么是对象流?

对象流用于存储和读取基本数据类型数据和对象的处理流。它的强大之处在于可以把java中的对象写入数据源中,也能把对象从数据源中还原回来。为了让对象持久化(把对象存储到本地),可以使用java的对象流处理对象,把对象的内容写到本地存储的文件中,也可以从本地文件中读取出来。

比如说:将100(int/整形类型)和== 你好(String/字符串类型)== 写入某文本,写入的时候需要保持文件的100为int类型,你好为String类型,此时就需要用到对象流。(在保持一个数据值的时候,能够把它的数据类型保存起来)

在这里插入图片描述

也就是常说的序列化和反序列化。

  • 序列化:一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型(保存一个对象的时候,保存数据的值和数据类型就叫序列化)
  • 反序列化:将序列化对象写入文件之后,可以从文件中读取出来(恢复数据的时候,恢复数据的值和数据类型)

如果需要让某个对象支持序列化支持,则必须让其类是可序列化的。
为了让某个类是可序列化,该类必须实现如下两个接口之一:

  • Serializable:提供的通用数据保存和读取的接口(标记接口,没有方法)
  • Externalizable:该接口有方法需要实现,一般使用Serializable接口实现

基本介绍

  • ObjectOutputStream:提供序列化功能
  • ObjectInputStream:提供反序列化功能

功能::提供了对基本类型或对象类型的序列化和反序列化的方法

在这里插入图片描述
根据图可知,这两个类提供的构造器中采用了修饰器模式(传入的是各自父类的子类的实现对象,用什么方式操作,就传什么)

ObjectOutputStream

把对象转成字节数据的输出到文件中保存,对象的输出过程称为序列化,可实现对象的持久存储。

构造器

在这里插入图片描述
具体操作方法可以查看JDK文档或者百度
JDK8英文在线文档
JDK8中文在线文档

使用ObjectOutputStream序列化基本数据类型和一个Dog对象(自定义),并保存到data.dat文件中

序列化后,保存的文件格式不是纯文本的,而是按照它的格式来保存

  • Integer实现了Serializable接口(int自动装箱)
  • Boolean实现了Serializable接口(boolean自动装箱)
  • Character实现了Serializable接口(char自动装箱)
  • Double实现了Serializable接口(double自动装箱)
  • String实现了Serializable接口
    在这里插入图片描述

注意:这里ObjectOutputStream_ 和Dog文件在同一目录下,如果不在同一个目录下,则需要导包!

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 演示使用ObjectOutputStream的使用
 */
public class ObjectOutputStream_ {
    public static void main(String[] args) {
        String filePath = "E:\\data.dat";//
        ObjectOutputStream os = null;
        try {
            os = new ObjectOutputStream(new FileOutputStream(filePath));
            //序列化数据E:\\data.dat
            os.writeInt(100);//int -> Integer(自动装箱)
            os.writeBoolean(true);//boolean -> Boolean(自动装箱)
            os.writeChar('a');//char -> Character
            os.writeDouble(3.14);//double -> Double
            os.writeUTF("hello");//String
            //保存自定义对象
            os.writeObject(new Dog("jack", 4));

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                os.close();//释放资源
                System.out.println("数据保存完毕(序列化)");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • Dog类
import java.io.Serializable;

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

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    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;
    }
}

文件打开乱码属于正常现象,此代码执行之后文件中内容:
 w d a@ 窺雲 hellosr com.chapter19.outputstream_.DogP戶嶏+/> I ageL namet Ljava/lang/String;xp t jack

ObjectInputStream

反序列化流,将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。

构造器

在这里插入图片描述

具体操作方法可以查看JDK文档或者百度
JDK8英文在线文档
JDK8中文在线文档

  • 读取(反序列化)的顺序要和保存数据(序列化)的顺序一致,否则会出现异常。

恢复ObjectOutputStream输出到文件中的数据和类型,恢复到程序中(反序列化)

注意:自定义类读取时,需要将定义的类拷贝到工程(并且公有化)或者导包

  • 这里我使用的是导包
import com.chapter19.outputstream_.Dog;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStream_ {
    public static void main(String[] args) {
        String filePath = "E:\\data.dat";//指定反序列化的文件
        ObjectInputStream oi = null;
        try {
            oi = new ObjectInputStream(new FileInputStream(filePath));
            System.out.println(oi.readInt());
            System.out.println(oi.readBoolean());
            System.out.println(oi.readChar());
            System.out.println(oi.readDouble());
            System.out.println(oi.readUTF());
            Object obj = oi.readObject();
            System.out.println(obj);
            System.out.println("运行类型" + obj.getClass());
            Dog o1 = (Dog) obj;
            System.out.println(o1.getName());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                oi.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

控制台输出如下:
a
3.14
hello
com.chapter19.outputstream_.Dog@6f496d9f
运行类型class com.chapter19.outputstream_.Dog
jack


对象处理流的使用细节

  1. 读写顺序要一致,如果顺序出错,则会抛出异常

  2. 要求序列化或反序列化对象,需要实现Serializable接口

  3. 序列化的类中建议添加SerialVersionUID,提高版本的兼容性
    在这里插入图片描述
    当文件中添加新的内容需要执行时,JVM会认为这个文件只是这个个版本的修改版或升级版,而不会认为是一个新的类(与游戏更新类似)

  4. 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员(被transient修饰的变量不参与序列化和反序列化)

  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口(int、char、double等会自动封装类型)

  6. 序列化具有可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C规范编辑笔记(十一)

往期文章: C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) C规范编辑笔记(八) C规范编辑笔记(九) C规则编辑笔记(十) 正文: 因为太久没有更新了,今天就…

Elasticsearch7.8.0版本高级查询—— 多关键字精确查询文档

目录一、初始化文档数据二、多关键字精确查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","…

干货 | 算力网络节点可信度评估和安全管控方案

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分:算力网络第二部分:可信度评估一、可信度评估在整个算力网络处理任务的实施流程中,不同部分有不同可信度评估的方法,具体包括:…

忙活了一年的开源社区,终于赶上了春节前的末班车!

随着春节的临近,忙碌了一年的小伙伴们,是不是都已经踏上了回乡的列车?我呢也终于在春节前,完成了 HelloGitHub.com 的重构。HelloGitHub.com 是我在 2017 年的时候用 FlaskjQuery 开发的网站,最初的想法很简单就是为了…

MySQL34道练习题

1、取得每个部门最高薪水的人员名称(要求显示部门编号、人员名称和薪资) 第一步:查询每个部门的最高薪资 SELECT deptno,max(sal) as maxsal FROM emp GROUP BY deptno; 第二步:把上面查询结果当做临时表t&#xff0…

Pagoda panel宝塔面板

宝塔面板是干什么的?有哪些典型的功能作用?宝塔面板是开发的服务器管理工具,是一家专业从事服务器相关软件和服务研发的公司。宝塔的愿景是让用户更容易使用服务器。宝塔面板是一款服务器管理软件,支持Windows和Linux系统,服务器…

【SpringCloud18】SpringCloud Alibaba Nacos服务注册和配置中心

1.Nacos简介 1.1为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service 1.2 是什么 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台Nacos:Dynamic Naming and Configuration ServiceNacos就是注册中心 配置中心…

简单双向LSTM模型实战项目

前言 数据来自于kaggle比赛Ventilator Pressure Prediction,数据背景介绍请看官方说明代码来自于当前排名第一的团队Shujun, Kha, Zidmie, Gilles, B,他们在获得第一名的成绩以后发了一篇博客,提供了他们在比赛中使用的模型,包括…

[C/C++]对象指针

对象指针 1.对象指针变量 和基本类型变量一样,对象在初始化之后也会在内存中占有若干字节的内存空间。因此在程序中,我们可以通过对象名或对象的地址来访问该对象。对象指针变量就是一个用于保存对象在内存中存储空间首地址的指针变量,它与普…

Python Matplotlib 中如何用 plt.savefig 存储图片

目录前言正文前言 plt.show()展示图片的时候,截图进行保存,图片不是多么清晰 如何保存高清图也是一知识点 函数包名:import matplotlib.pyplot as plt 正文 主要功能:保存绘制数据后创建的图形。使用此方法可以将创建的图形保…

MobaXterm的安装与使用

安装: 分为开箱即用和逐步配置版本,这里选择开箱即用的版本,网址如下: MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - Home EditionFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Home Editionhttps://mobaxterm.m…

Java面试题(2),这是一篇会一直更新的博客!欢迎大家留言~

Java面试题第二篇1. 并发的三大特性2、线程池、解释线程池参数3、BeanFactory和ApplicationContext有什么区别?4、描述一下Spring Bean的生命周期5、Spring的几种Bean的作用域6、单例Bean是线程安全的吗?7、Spring框架用到了哪些设计模式8、Spring事务的…

Magic Leap CEO:我们的目标是再回到消费级AR市场

相比于几年前,Magic Leap在CEO换人后经历了一系列变化,其中更明显的变化,就是这家公司似乎变得更低调、更务实。此前,Magic Leap的内容库包括了大量趣味、娱乐的AR应用,而现在则主要改成B端解决方案,随着ML…

小程序商城源码代码分析

微信平台开发直播插件后,许多传统的商家开始加入小程序商城源码开发的队伍中,以此来自主管理自己的产品。下文,小编将为大家盘点一下小程序商城源码的优势,以及代码分析。 一、小程序商城源码有什么优势? 1、拓展私域…

定时任务中将redis数据存入数据库相关问题

我的GitHub:Powerveil GitHub我的Gitee:Powercs12 (powercs12) - Gitee.com皮卡丘每天学Java觉得昨天晚上只是分析和解决问题,很多人可能不知道出bug的场景,今天决定重现bug,让代码改回错误代码,重现看到一…

科研快报|PacBio 16S全长测序探究游离唾液微生物群失调在牙周病中的潜在作用

背景介绍唾液是口腔中最重要的介质。唾液中游离细菌的生态失调可能与牙周病的发生、发展、预后和复发有关,但这种潜在的关系尚不清楚。本研究的目的是探讨游离唾液微生物群在不同牙周状态下的潜在作用,它们对非手术牙周治疗的反应,以及治疗后…

年后旺季,服装实体店如何利用微信做新款宣传?

每年过完大年开工后,我们服装的旺季就来临了,对于很多服装店铺来说,无疑是一个必须把握的大好机会。就拿这几天的天气来说,广东最高温度达到了26度,很多人又把自己春夏的衣服拿出来了,而年后气温必然回暖&a…

Swin Transformer代码实战篇

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了! CV攻城狮入门VIT(vision transformer)之旅——VIT原…

列表元素 有序列表 无序列表 定义列表 ol: ul: dl: dd: dt:

目录列表元素有序列表无序列表定义列表列表元素 有序列表 ol: ordered list 表示整个列表 li: list item 表示单个列表,列表的子元素 reversed: 导则 列表的写法: 但实际开发中一般不用type来设置列表的序,而是用css 把大象装冰箱分几步…

SpringBoot 项目

不得不佩服 Spring Boot 的生态如此强大,今天我给大家推荐几款 Gitee 上优秀的后台开源版本的管理系统,小伙伴们再也不用从头到尾撸一个项目了,简直就是接私活,挣钱的利器啊。SmartAdmin我们开源一套漂亮的代码和一套整洁的代码规…