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

news2025/1/18 21:06:42

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

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

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

 

一、java.io

1.48 ObjectOutputStream

ObjectOutputStream 类用于将对象序列化为字节流。它可以将 Java 对象写入输出流中,以便存储到文件、网络或其他输出目标。

ObjectOutputStream 类介绍:
所有字段:
  • 没有字段。

构造方法:
  • ObjectOutputStream(OutputStream out) throws IOException:创建一个新的 ObjectOutputStream,将其写入指定的 OutputStream。

方法摘要:
  • void writeObject(Object obj) throws IOException:将指定的对象写入流中。

  • void flush() throws IOException:刷新输出流,强制将所有缓冲的输出字节写入流中。

  • void close() throws IOException:关闭输出流,释放与流相关的任何系统资源。

简单使用例子:

下面是一个简单的例子,演示了如何使用 ObjectOutputStream 将对象写入文件:

javaCopy code
import java.io.*;
​
public class ObjectOutputStreamExample {
    public static void main(String[] args) {
        String fileName = "object.ser";
​
        try (OutputStream outputStream = new FileOutputStream(fileName);
             ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
​
            // 创建对象
            MyObject obj = new MyObject("Hello, world!");
​
            // 将对象写入输出流
            objectOutputStream.writeObject(obj);
​
            System.out.println("Object has been written to file successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
​
class MyObject implements Serializable {
    private static final long serialVersionUID = 1L;
    private String data;
​
    public MyObject(String data) {
        this.data = data;
    }
​
    @Override
    public String toString() {
        return "MyObject{" +
                "data='" + data + '\'' +
                '}';
    }
}

在上面的例子中,我们首先创建了一个 MyObject 类,并实现了 Serializable 接口。然后,我们使用 ObjectOutputStreamMyObject 对象写入到名为 "object.ser" 的文件中。通过调用 writeObject() 方法,我们将对象写入到输出流中。

应用场景

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

应用场景 1: 将对象序列化并写入文件
javaCopy code
import java.io.*;
​
public class SerializeObjectToFile {
    public static void main(String[] args) {
        String fileName = "object.ser";
​
        try (OutputStream outputStream = new FileOutputStream(fileName);
             ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
​
            // 创建并写入对象到文件
            MyObject obj = new MyObject("Hello, world!");
            objectOutputStream.writeObject(obj);
​
            System.out.println("Object has been written to file successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
​
class MyObject implements Serializable {
    private static final long serialVersionUID = 1L;
    private String data;
​
    public MyObject(String data) {
        this.data = data;
    }
​
    @Override
    public String toString() {
        return "MyObject{" +
                "data='" + data + '\'' +
                '}';
    }
}
应用场景 2: 将对象序列化并写入网络流
javaCopy code
import java.io.*;
import java.net.*;
​
public class SerializeObjectToNetwork {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 12345);
             OutputStream outputStream = socket.getOutputStream();
             ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
​
            // 创建并写入对象到网络流
            MyObject obj = new MyObject("Hello, world!");
            objectOutputStream.writeObject(obj);
​
            System.out.println("Object has been written to network stream successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
应用场景 3: 将对象序列化并写入数据库 Blob 字段
javaCopy code
import java.io.*;
import java.sql.*;
​
public class SerializeObjectToDatabase {
    public static void main(String[] args) {
        try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
             PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO MyTable (object_data) VALUES (?)")) {
​
            // 创建对象并将其序列化为字节数组
            MyObject obj = new MyObject("Hello, world!");
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            try (ObjectOutput objectOutput = new ObjectOutputStream(byteArrayOutputStream)) {
                objectOutput.writeObject(obj);
            }
​
            // 将对象数据写入数据库 Blob 字段
            preparedStatement.setBytes(1, byteArrayOutputStream.toByteArray());
            preparedStatement.executeUpdate();
​
            System.out.println("Object has been written to database successfully.");
        } catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }
}

这些是使用 ObjectOutputStream 的一些常见应用场景及相应的代码实现,包括将对象序列化并写入文件、网络流和数据库 Blob 字段中。

实战例子

下面是一个示例项目,演示了如何使用 ObjectOutputStream 将用户对象写入文件,并使用 ObjectInputStream 从文件中读取用户对象:

javaCopy code
import java.io.*;
​
public class UserSerializationExample {
​
    static class User implements Serializable {
        private static final long serialVersionUID = 1L;
​
        private String username;
        private transient String password; // 密码字段不参与序列化
​
        public User(String username, String password) {
            this.username = username;
            this.password = password;
        }
​
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
​
    public static void main(String[] args) {
        String fileName = "users.ser";
​
        // 写入用户对象到文件
        writeUsersToFile(fileName);
​
        // 从文件中读取用户对象并处理
        readUsersFromFile(fileName);
    }
​
    private static void writeUsersToFile(String fileName) {
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {
            User user1 = new User("user1", "password123");
            User user2 = new User("user2", "password456");
​
            outputStream.writeObject(user1);
            outputStream.writeObject(user2);
​
            System.out.println("Users have been written to file successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static void readUsersFromFile(String fileName) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {
            while (true) {
                try {
                    Object obj = inputStream.readObject();
                    if (obj instanceof User) {
                        User user = (User) obj;
                        System.out.println("User read from file: " + user);
                    }
                } catch (EOFException e) {
                    // 到达文件末尾
                    break;
                }
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个示例项目中,我们创建了一个 User 类,并实现了 Serializable 接口。然后,我们使用 ObjectOutputStream 将两个 User 对象写入到名为 "users.ser" 的文件中。接着,我们使用 ObjectInputStream 从文件中读取用户对象,并进行处理。

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

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

相关文章

vue2和vue3对比(语法层面)

阅读文章你将收获: 1 了解不使用组件化工具时,vue在html是如何使用的 2 知道vue2的生命周期函数有哪些 3 知道如何在组件化开发中使用vue 4 大致了解了vue2和vue3在使用上什么不同 最后:vue2和vue3除了下面我列出的有差异化的地方&…

Langchain-Chatchat部署总结

项目地址: https://github.com/chatchat-space/Langchain-Chatchat 整体安装比较方便,在阿里云购买云主机,购买的国外站点机器, 该项目运行最佳坏境为 Linux Ubuntu 22.04.5Python 版本 3.11.7CUDA 版本: 12.1torch2.1.2 使…

SpringBoot Admin 详解

SpringBoot Admin 详解 一、Actuator 详解1.Actuator原生端点1.1 监控检查端点:health1.2 应用信息端点:info1.3 http调用记录端点:httptrace1.4 堆栈信息端点:heapdump1.5 线程信息端点:threaddump1.6 获取全量Bean的…

找游戏 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 小扇和小船今天又玩起来了数字游戏, 小船给小扇一个正整数 n(1 ≤ n ≤ 1e9),小扇需要找到一个比 n 大的数字 m&a…

PMP项目管理考试要注意些什么?

PMP考试和PMP备考过程中应该注意哪些问题? PMP备考完成后就要迎接实战考试了,考试前千万不要有多余的想法,顺其自然就行了,我想大家各种紧张、各种忧虑的原因大抵是因为考试成本考,担心考不过,其实只要你在…

【并发】CAS原子操作

1. 定义 CAS是Compare And Swap的缩写,直译就是比较并交换。CAS是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令,这个指令会对内存中的共享数据做原子的读写操作。其作用是让CPU比较内存中某个值是否和预期的值相同,如果相…

Linux——缓冲区封装系统文件操作

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、FILE二、封装系统接口实现文件操作1、text.c2、mystdio.c3、mystdio.h 一、FILE 因为IO相…

基于粒子群算法优化BP神经网络的黄酮含量预测,基于pso-bp的黄酮水平预测,基于bp神经网络的黄酮预测

目录 摘要 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 粒子群算法的原理及步骤 基于粒子群算法优化BP神经网络的黄酮含量预测,基于pso-bp的黄酮水平预测,基于bp神经网络的黄酮预测 matlab代码…

【线程池项目(三)】线程池CACHED模式的实现

在上一篇【线程池项目(二)】线程池FIXED模式的实现 中我们了解到到线程池fixed模式的大致实现原理,但对于一个比较完整的项目来说,我们还需要考虑到可能会发生的各种情况,比如用户提交的任务数可能在某一时刻急剧增加&…

5.2 Ajax 数据爬取实战

目录 1. 实战内容 2、Ajax 分析 3、爬取内容 4、存入MySQL 数据库 4.1 创建相关表 4.2 数据插入表中 5、总代码与结果 1. 实战内容 爬取Scrape | Movie的所有电影详情页的电影名、类别、时长、上映地及时间、简介、评分,并将这些内容存入MySQL数据库中。 2、…

在springboot中调用openai Api并实现流式响应

之前在《在springboot项目中调用openai API及我遇到的问题》这篇博客中,我实现了在springboot中调用openai接口,但是在这里的返回的信息是一次性全部返回的,如果返回的文字比较多,我们可能需要等很久。 所以需要考虑将请求接口响应…

LeetCode--代码详解 235.二叉搜索树得最近公共祖先

235.二叉搜索树得最近公共祖先 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可…

【架构】面向人工智能 (AI) 的硬件的可靠性(2021)

由于激进的技术扩展,现代系统越来越容易受到可靠性威胁的影响,例如软错误、老化和工艺变化。这些威胁在硬件级别表现为位翻转,并且根据位置,可能会损坏输出,从而导致不准确或潜在的灾难性结果。 传统的缓解技术基于冗…

计算机网络Day03--物理层

信道复用技术 频分复用 时分复用 统计时分复用 频分复用(FDM) 最基本 将整个宽带分为多份,用户在分配到一定的频带后,在通信过程中自始至终都使用这个频带 所有的用户在同一时间占用不同的带宽资源,以并行的方式工…

一文带你彻底搞懂 Python 编程进阶之闭包

什么是闭包:在函数嵌套的情况下,内部的函数使用外部函数中的变量,并且外部函数返回了内部函数,我们将这个内部函数称之为闭包。 闭包是实现装饰器的基础,通过装饰器可以在不修改原函数代码的情况下增强其功能。 在Py…

JDK10新特性:探索Java10的编程新境界

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

nodejs+vue+ElementUi废品废弃资源回收系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统,管理员可以对系统用户管理、用户信息管理、回收站点管理、站点分类管理、站点分类管理、留言板管理、系统管理进行添加、查询、修改、删除,以保障废弃资源回收系统系统的正常…

异步框架Celery在Django中的运用

参考博客:https://www.cnblogs.com/pyedu/p/12461819.html 参考视频:01 celery的工作机制_哔哩哔哩_bilibili 定义:简单灵活、处理大量消息的分布式系统,专注于实时处理异步队列,支持任务调度 主要架构: …

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:分配和注册字符设备

🚀返回专栏总目录 文章目录 一、分配和注册字符设备二、file_operations沉淀、分享、成长,让自己和他人都能有所收获!😄 一、分配和注册字符设备 字符设备在内核中表示为struct cdev的实例。在编写字符设备驱动程序时,目标是最终创建并注册与struct file_operations关联…