(每日持续更新)jdk api之ObjectInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程

一、java.io

1.44 ObjectInputStream

ObjectInputStream类是用于从输入流中读取Java对象的类,它可以将对象从字节流反序列化为Java对象。以下是关于ObjectInputStream类的基本介绍:

ObjectInputStream 介绍:
所有字段:
  • protected ObjectInputStream$GetField fields 用于读取序列化对象的字段值的GetField对象。

构造方法:
  • protected ObjectInputStream() throws IOException, SecurityException:创建一个新的ObjectInputStream,它使用默认的类加载器和默认的安全管理器。

  • ObjectInputStream(InputStream in) throws IOException:使用指定的输入流创建一个新的ObjectInputStream

方法摘要:
  • void defaultReadObject() 从流中读取默认的对象字段值,以恢复对象的状态。

  • GetField readFields() 读取序列化对象的字段值,返回一个GetField对象,可以用于访问字段的值。

  • int read() 从输入流中读取一个字节的数据。

  • Object readObject() 从输入流中读取对象。

  • int read(byte[] buf, int off, int len) 从输入流中读取字节数组的一部分数据。

  • Object readUnshared() 从输入流中读取一个未共享的对象。

  • void registerValidation(ObjectInputValidation obj, int prio) 注册一个对象验证回调。

简单使用例子:
javaCopy code
import java.io.*;
​
public class ObjectInputStreamExample {
​public static void main(String[] args) {String fileName = "data.ser";saveDataToFile(fileName);loadDataFromFile(fileName);}
​private static void saveDataToFile(String fileName) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {// 将对象保存到文件MyObject obj = new MyObject("Hello, ObjectInputStream!");outputStream.writeObject(obj);System.out.println("Object saved to file successfully.");} catch (IOException e) {e.printStackTrace();}}
​private static void loadDataFromFile(String fileName) {try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {// 从文件加载对象MyObject obj = (MyObject) inputStream.readObject();System.out.println("Loaded object from file: " + obj.getData());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
​static class MyObject implements Serializable {private static final long serialVersionUID = 1L;private String data;
​public MyObject(String data) {this.data = data;}
​public String getData() {return data;}}
}

在这个简单的例子中,我们创建了一个MyObject类,它实现了Serializable接口,表示可以序列化。我们将一个MyObject对象保存到文件中,并使用ObjectInputStream从文件中加载对象。加载的对象可以强制转换为MyObject类型,并访问其数据。

应用场景

以下是一些使用 ObjectInputStream 的常见应用场景及相应的代码实现:

应用场景 1: 从文件中读取对象并进行处理
javaCopy code
import java.io.*;
​
public class ReadObjectsFromFile {public static void main(String[] args) {String fileName = "data.ser";try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {Object obj = inputStream.readObject();// 处理从文件中读取的对象System.out.println("Object read from file: " + obj);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
应用场景 2: 从网络流中读取对象并进行处理
javaCopy code
import java.io.*;
import java.net.*;
​
public class ReadObjectsFromNetwork {public static void main(String[] args) {try {Socket socket = new Socket("localhost", 8080);ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());Object obj = inputStream.readObject();// 处理从网络流中读取的对象System.out.println("Object read from network: " + obj);inputStream.close();socket.close();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
应用场景 3: 从字节数组中读取对象并进行处理
javaCopy code
import java.io.*;
​
public class ReadObjectsFromByteArray {public static void main(String[] args) {byte[] data = {/* Byte array with serialized object data */};try (ByteArrayInputStream byteInput = new ByteArrayInputStream(data);ObjectInputStream inputStream = new ObjectInputStream(byteInput)) {Object obj = inputStream.readObject();// 处理从字节数组中读取的对象System.out.println("Object read from byte array: " + obj);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
应用场景 4: 读取多个对象直到文件末尾
javaCopy code
import java.io.*;
​
public class ReadMultipleObjects {public static void main(String[] args) {String fileName = "data.ser";try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {while (true) {try {Object obj = inputStream.readObject();// 处理每个读取的对象System.out.println("Object read from file: " + obj);} catch (EOFException e) {// 文件末尾,退出循环break;}}} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

这些例子涵盖了从文件、网络、字节数组中读取对象以及处理多个对象的场景。通过 ObjectInputStream 可以方便地实现从不同来源读取对象并进行相应处理。

实战例子

以下是一个简单的项目实战例子,演示了如何使用 ObjectInputStream 读取对象并进行处理:

javaCopy code
import java.io.*;
​
public class ObjectInputStreamExample {
​static class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;
​public Person(String name, int age) {this.name = name;this.age = age;}
​@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}
​public static void main(String[] args) {String fileName = "person.ser";
​// 写入对象到文件writeObjectToFile(fileName);
​// 从文件读取对象并处理readObjectFromFile(fileName);}
​private static void writeObjectToFile(String fileName) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {Person person = new Person("Alice", 30);outputStream.writeObject(person);System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}}
​private static void readObjectFromFile(String fileName) {try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {Object obj = inputStream.readObject();if (obj instanceof Person) {Person person = (Person) obj;System.out.println("Object read from file: " + person);}} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

在这个示例中,我们定义了一个 Person 类,实现了 Serializable 接口,表示可以序列化。然后我们将一个 Person 对象写入到文件中,并使用 ObjectInputStream 从文件中读取对象。加载的对象可以转换为 Person 类型,并输出到控制台。

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

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

相关文章

[职场] 公务员面试停顿磕巴常见吗 #学习方法#知识分享#知识分享

公务员面试停顿磕巴常见吗 面试时说话磕巴简直是太常见了,对于一个新问题,让人在短时间内,并且仅仅是三分钟内,就组织起一个答案,还无法全部打手稿,这对于连上个讲台都会脸发红的人来说,简直是一…

如何连接ChatGPT?无需科学上网,使用官方GPT教程

随着AI的发展,ChatGPT也越来越强大了。 它可以帮你做你能想到的几乎任何事情,妥妥的生产力工具。 然而,对于许多国内的用户来说,并不能直接使用ChatGPT,不过没关系,我最近发现了一个可以直接免科学上网连…

JSP原理简述

JSP动态网页技术,可以定义html,css,js等静态内容,还可以定义java代码等动态内容。 注意导入坐标时,JSP的scope标签是provided,和servlet一样,否则会报错。 JSP本质上就是一个Servlet&#xff0c…

APEX开发过程中需要注意的小细节2

开发时遇到首次获取租户号失败的问题 以为是触发顺序问题,所以设置两个动态操作,一个事件是“更改”,另一个是“单击”, 但还是没有解决, 后来终于找到解决方法:在校验前执行取值 果然成功执行! 动态查询年…

【开源】SpringBoot框架开发考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

RK3588平台开发系列讲解(AI 篇)什么是NPU

文章目录 一、什么是NPU二、什么是RKNPU沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解什么是NPU。 一、什么是NPU 📢什么是 NPU 呢? 在谈这个问题之前,可以先来看看什么是 CPU 和 GPU,CPU 就是中央处理器,中央处理器就好像是人类的大脑,主要负…

基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

动态SQl简单创建

创建pojo实体类,使用lombok注解 package com.example.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.time.LocalDate; import java.time.LocalDateTime;Data NoArgsConstructor AllArgsConstructor pu…

【51单片机】LCD1602(可视化液晶屏)调试工具的使用

前言 大家好吖,欢迎来到 YY 滴 单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY…

MATLAB知识点:逻辑运算函数

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.4.4 逻辑运算 3.4.4.1 逻辑运算函数 在上…

DBdoctor恭祝大家龙行龘龘,前程朤朤

值此新年之际,DBdoctor恭祝大家龙行龘龘,前程朤朤。尤其是当前还跟我一样奋斗在护航春节一线的战友们,祝愿大家2024年系统又快又稳。 今年是DBdoctor护航春晚的第三年,聚好看作为海信旗下的互联网科技公司,服务着海信…

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库,用C语言开发,仓库地址:https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展,其对底层引脚的操作也变得越来…

学习通考试怎么搜题找答案? #学习方法#微信#其他

大学生必备的做题、搜题神器,收录上万本教材辅助书籍,像什么高数、物理、计算机、外语等都有,资源十分丰富。 1.菜鸟教程 菜鸟教程是一个完全免费的编程学习软件。 它免费提供了HTML / CSS 、JavaScript 、服务端、移动端、XML 教程、http…

leetcode(滑动窗口)483.找到字符中所有字母异位词(C++详细解释)DAY4

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串&a…

通俗易懂:快速排序算法全解析

快速排序(Quick Sort)是一种高效的分治排序算法,它以其出色的性能和广泛的应用而闻名。本文将深入讲解快速排序的原理、步骤和时间复杂度,并探讨其优势和应用场景。 快速排序原理 快速排序的核心思想是通过选择一个基准元素&…

springboot167基于springboot的医院后台管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Bee+SpringBoot稳定的Sharding、Mongodb ORM功能(同步 Maven)

Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee 小巧玲珑!仅 860K, 还不到 1M, 但却是功能强大! V2.2 (2024春节・LTS 版) 1.Javabean 实体支持继承 (配置 bee.osql.openEntityCanExtendtrue) 2. 增强批…

Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)

1. 前言 在上一篇文章中,我们了解了Vue中的patch过程,即DOM-Diff算法。并且知道了在patch过程中基本会干三件事,分别是:创建节点,删除节点和更新节点。创建节点和删除节点都比较简单,而更新节点因为要处理…

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】 前言预备知识1.DHT11温湿度传感器初识1.1产品概述1.2与51单片机接线1.3数据传送逻辑和数据格式 2.发送时序检测DHT11温湿度传感…

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…