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

news2025/1/17 2:55:11

博主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;
        }
​
        @Override
        public 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://www.coloradmin.cn/o/1442229.html

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

相关文章

单片机学习路线(简单介绍)

学习单片机对于电子爱好者和未来的嵌入式系统工程师来说是一段激动人心的旅程。单片机因其强大的功能、灵活性以及在各种智能设备中的广泛应用,成为了电子和计算机科学领域一个不可或缺的组成部分。如果你对如何开始这段旅程感到好奇,那么你来对地方了。…

kmeans聚类选择最优K值python实现

Kmeans算法中K值的确定是很重要的。 下面利用python中sklearn模块进行数据聚类的K值选择 数据集自制数据集,格式如下: 维度为3。 ①手肘法 手肘法的核心指标是SSE(sum of the squared errors,误差平方和), 其中,Ci是第…

编译器选择:VSCode安装MarkDown插件

目录 1.打开vscode2.点击扩展选项3.搜索 Markdown Preview Enhanced插件4.使用test示例5.然后右键鼠标选择打开侧边预览6.实时预览效果 注:本篇文章默认用户安装了vscode,未安装的可以自行查找教程安装。 注:看到后面的用户可以自己尝试尝试&…

Canvas笔记05:像素操作,可以对图像进行像素级别控制和处理

hello,我是贝格前端工场,最近在学习canvas,分享一些canvas的一些知识点笔记,本期分享canvas像素操作的知识,欢迎老铁们一同学习,欢迎关注,如有前端项目需要协助可私聊。 一、什么是像素操作 Ca…

【算法训练营】数字盒子,重编码,成绩排序(python实现)

数字盒子 问题描述 你有一个盒子,你可以往里面放数,也可以从里面取出数。 初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类: 插入操作:询问盒子中是否存在数 x,如果不存在则把数…

传输频宽是啥?对网速影响有多大?

频宽,即WIFI频道宽度,又称为WIFI信道宽度,是WiFi Channel width的缩写。从科学的定义来说,Wi-Fi频道宽度,是指Wi-Fi无线信号在频谱上所占用的带宽大小。它决定了Wi-Fi网络的数据传输速率和稳定性,一般有20M…

Gas Hero Coupon NFT 概览与数据分析

作者:stellafootprint.network 编译:mingfootprint.network 数据源:Gas Hero Coupon NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏,强调社交互动,并与 FSL 生态系统集成&#xff0…

【java苍穹外卖项目实战一】苍穹外卖项目介绍

文章目录 1、项目介绍1、项目概述2、 产品原型3、技术选型 1、项目介绍 在开发苍穹外卖这个项目之前,我们需要全方位的来介绍一下当前我们学习的这个项目。接下来,我们将从项目简介、产品原型、技术选型三个方面来介绍苍穹外卖这个项目。 1、项目概述 …

Android矩阵Matrix动画缩放Bitmap移动手指触点到ImageView中心位置,Kotlin

Android矩阵Matrix动画缩放Bitmap移动手指触点到ImageView中心位置,Kotlin 借鉴 Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2)-CSDN博客 在此基础上实现手指在屏幕上点击后&…

物资捐赠管理系统

文章目录 物资捐赠管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目(9.9¥带走) 物资捐赠管理系统 一、项目演示 爱心捐赠系统 二、项目介绍 基于springboot的爱心捐赠管理系统 开发语言&#xff1a…

动态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…

攻防世界——re2-cpp-is-awesome

64位 我先用虚拟机跑了一下这个程序,结果输出一串字符串flag ——没用 IDA打开后 F5也没有什么可看的 那我们就F12查看字符串找可疑信息 这里一下就看见了 __int64 __fastcall main(int a1, char **a2, char **a3) {char *v3; // rbx__int64 v4; // rax__int64 v…

【java苍穹外卖项目实战二】苍穹外卖环境搭建

文章目录 1、前端环境搭建2、后端环境搭建1、项目结构搭建2、Git版本控制3、数据库创建 开发环境搭建主要包含前端环境和后端环境两部分。 前端的页面我们只需要导入资料中的nginx, 前端页面的代码我们只需要能看懂即可。 1、前端环境搭建 前端运行环境的nginx&am…

【洛谷题解】P1075 [NOIP2012 普及组] 质因数分解

题目链接:[NOIP2012 普及组] 质因数分解 - 洛谷 题目难度:入门 涉及知识点:枚举(优化) 题意: 输入样例:21 输出样例:7 分析:枚举到小因数,再除a&#x…

关于CSDN的原力分增长规则,一点个人经验

本文章编写于 2024年2月9日 从2022年开始到现在,官方的原力分增减规则已经改过好几版了,有一些规则描述比较模糊,这里总结了一些个人经验。 原力值增长点: 1.每日发布文章一篇10分,两篇15分,上限15分&am…

微软AD域替代方案,助力企业摆脱hw期间被攻击的窘境

在红蓝攻防演练(hw行动)中,AD域若被攻击成功,是其中一个扣分最多的一项内容。每年,宁盾都会接到大量AD在hw期间被攻击,甚至是被打穿的企业客户。过去,企业还会借助2FA双因子认证加强OA、Exchang…

【漏洞复现】狮子鱼CMS某SQL注入漏洞

Nx01 产品简介 狮子鱼CMS(Content Management System)是一种网站管理系统,它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能,包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

Python 数据可视化之山脊线图 Ridgeline Plots

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 JoyPy 是一个基于 matplotlib pandas 的单功能 Python 包,它的唯一目的是绘制山脊线图 Joyplots(也称为 Ridgeline Plots&…

计算机速成课Crash Course - 30. 万维网

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞! 计算机速成课Crash Course - 30. 万维网 (qq.com) 30. 万维网 前两集我们深入讨论了电线、信号、交…

EasyExcel操作Excel表格

一、EasyExcel介绍 1.1 介绍 EasyExcel 是一个基于 Java 的简单易用的 Excel 文件读写工具,它提供了一种简单而又高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴开源的项目,它旨在简化开发人员处理 Excel 文件的流程,使得…