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

news2024/11/15 23:28:34

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

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

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

一、java.io

1.39 ObjectInput

ObjectInput 接口是 Java 中用于读取对象的输入流的一部分。它位于 java.io 包下,是 ObjectInputStream 的父接口。以下是 ObjectInput 接口的基本介绍:

ObjectInput 介绍:
所有字段:
  • 无特定字段。

构造方法:
  • 无构造方法,因为接口不能有构造方法。

方法摘要:
  • int available() 返回在没有阻塞的情况下可以读取的字节数。

  • void close() 关闭流。在关闭流之后,不能再调用读取操作。

  • int read() 读取单个字节的数据。

  • int read(byte[] b) 将字节数组中的数据读入到一个字节数组中。

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

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

  • long skip(long n) 跳过并丢弃输入流中的数据。

简单使用例子:
javaCopy code
import java.io.*;
​
public class ObjectInputExample {
​
    public static void main(String[] args) {
        String fileName = "data.bin";
​
        // 模拟从文件加载对象
        loadObjectFromFile(fileName);
    }
​
    private static void loadObjectFromFile(String fileName) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {
            Object object = inputStream.readObject();
            if (object instanceof MyClass) {
                MyClass myObject = (MyClass) object;
                System.out.println("Loaded object: " + myObject);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    static class MyClass implements Serializable {
        private String data;
​
        public MyClass(String data) {
            this.data = data;
        }
​
        @Override
        public String toString() {
            return "MyClass{" +
                    "data='" + data + '\'' +
                    '}';
        }
    }
}

在这个例子中,我们创建了一个 ObjectInputExample 类,其中包含了一个静态内部类 MyClass,它实现了 Serializable 接口。在 loadObjectFromFile 方法中,我们使用 ObjectInputStream 从文件中读取一个对象,并判断它是否是 MyClass 的实例,然后输出加载的对象。请注意,此示例仅演示了 ObjectInput 的基本使用。在实际项目中,可能需要更复杂的数据处理逻辑和异常处理。

应用场景

ObjectInput 接口通常用于从输入流中读取对象,它的实现类 ObjectInputStream 为我们提供了对象的反序列化功能。以下是一些可能的应用场景及相应的代码实现:

应用场景 1: 从文件中读取对象
javaCopy code
import java.io.*;
​
public class ObjectInputFileExample {
​
    public static void main(String[] args) {
        String fileName = "data.bin";
​
        // 模拟从文件加载对象
        loadObjectFromFile(fileName);
    }
​
    private static void loadObjectFromFile(String fileName) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {
            Object object = inputStream.readObject();
            if (object instanceof MyClass) {
                MyClass myObject = (MyClass) object;
                System.out.println("Loaded object: " + myObject);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    static class MyClass implements Serializable {
        private String data;
​
        public MyClass(String data) {
            this.data = data;
        }
​
        @Override
        public String toString() {
            return "MyClass{" +
                    "data='" + data + '\'' +
                    '}';
        }
    }
}

在这个例子中,我们通过 ObjectInputStream 从文件中读取一个对象(MyClass 类的实例)。

应用场景 2: 从网络流中读取对象
javaCopy code
import java.io.*;
import java.net.Socket;
​
public class ObjectInputNetworkExample {
​
    public static void main(String[] args) {
        // 模拟从网络流加载对象
        loadObjectFromNetwork();
    }
​
    private static void loadObjectFromNetwork() {
        try (Socket socket = new Socket("localhost", 8080);
             ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream())) {
​
            Object object = inputStream.readObject();
            if (object instanceof MyClass) {
                MyClass myObject = (MyClass) object;
                System.out.println("Loaded object from network: " + myObject);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    static class MyClass implements Serializable {
        private String data;
​
        public MyClass(String data) {
            this.data = data;
        }
​
        @Override
        public String toString() {
            return "MyClass{" +
                    "data='" + data + '\'' +
                    '}';
        }
    }
}

在这个例子中,我们通过 ObjectInputStream 从网络流中读取一个对象。

应用场景 3: 从其他输入流中读取对象
javaCopy code
import java.io.*;
​
public class ObjectInputOtherStreamExample {
​
    public static void main(String[] args) {
        // 模拟从其他输入流加载对象
        loadObjectFromOtherStream(new ByteArrayInputStream("Hello".getBytes()));
    }
​
    private static void loadObjectFromOtherStream(InputStream input) {
        try (ObjectInputStream inputStream = new ObjectInputStream(input)) {
​
            Object object = inputStream.readObject();
            if (object instanceof MyClass) {
                MyClass myObject = (MyClass) object;
                System.out.println("Loaded object from other stream: " + myObject);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    static class MyClass implements Serializable {
        private String data;
​
        public MyClass(String data) {
            this.data = data;
        }
​
        @Override
        public String toString() {
            return "MyClass{" +
                    "data='" + data + '\'' +
                    '}';
        }
    }
}

在这个例子中,我们通过 ObjectInputStream 从其他输入流(这里是 ByteArrayInputStream)中读取一个对象。

这些例子展示了 ObjectInput 在不同场景下的应用,包括从文件、网络流和其他输入流中读取对象。在实际项目中,你可能需要根据具体的业务需求选择合适的应用场景。

实战例子

以下是一个简单的项目实战例子,演示了如何使用 ObjectInput 接口和 ObjectInputStream 类从文件中加载并展示存储的用户对象信息。

项目实战例子:用户信息存储和加载

假设你的应用程序需要存储用户对象信息,并在需要时从文件中加载这些信息。以下是一个简单的实例:

javaCopy code
import java.io.*;
import java.util.ArrayList;
import java.util.List;
​
public class UserStorageProject {
​
    public static void main(String[] args) {
        String fileName = "user_data.ser";
​
        // 模拟保存用户信息到文件
        saveUsersToFile(fileName);
​
        // 模拟加载用户信息并展示
        loadAndDisplayUsers(fileName);
    }
​
    private static void saveUsersToFile(String fileName) {
        List<User> users = new ArrayList<>();
        users.add(new User("John", 25));
        users.add(new User("Alice", 30));
​
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {
            outputStream.writeObject(users);
            System.out.println("Users saved to file successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static void loadAndDisplayUsers(String fileName) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {
            Object object = inputStream.readObject();
            if (object instanceof List) {
                List<User> loadedUsers = (List<User>) object;
                System.out.println("Loaded users:");
                for (User user : loadedUsers) {
                    System.out.println(user);
                }
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    static class User implements Serializable {
        private String name;
        private int age;
​
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
​
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

在这个例子中,我们定义了一个 User 类实现了 Serializable 接口,表示用户信息。我们使用 ObjectOutputStream 将包含 User 对象的列表写入文件,并使用 ObjectInputStream 从文件中读取列表。最后,我们展示了加载的用户信息。

请注意,这只是一个简单的示例,实际项目中可能需要更复杂的数据处理逻辑和错误处理。

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

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

相关文章

11. Threejs案例-绘制网格状圆环扭结

11. Threejs案例-绘制网格状圆环扭结 实现效果 知识点 TorusKnotGeometry (圆环缓冲扭结几何体) 创建一个圆环扭结&#xff0c;其特殊形状由一对互质的整数&#xff0c;p 和 q 所定义。如果 p 和 q 不互质&#xff0c;创建出来的几何体将是一个环面链接。 构造器 TorusKno…

解锁MyBatis Plus的强大功能:学习高级操作与DML技巧!

MyBatisPlus 1&#xff0c;DML编程控制1.1 id生成策略控制知识点1&#xff1a;TableId1.1.1 环境构建1.1.2 代码演示AUTO策略步骤1:设置生成策略为AUTO步骤3:运行新增方法 INPUT策略步骤1:设置生成策略为INPUT步骤2:添加数据手动设置ID步骤3:运行新增方法 ASSIGN_ID策略步骤1:设…

12种算法优化CNN-BiLSTM-Attention多特征输入单步预测,机器学习预测全家桶,持续更新,MATLAB代码...

截止到本期&#xff0c;一共发了12篇关于机器学习预测全家桶MATLAB代码的文章。参考文章如下&#xff1a; 1.五花八门的机器学习预测&#xff1f;一篇搞定不行吗&#xff1f; 2.机器学习预测全家桶&#xff0c;多步预测之BiGRU、BiLSTM、GRU、LSTM&#xff0c;LSSVM、TCN、CNN&…

leetcode正则表达式匹配问题(困难)

1.题目描述 2.解题思路&#xff0c;这道题自己没做出来&#xff0c;看了官方的题解&#xff0c;感觉对自己来说确实是比较难想的。使用了动态规划的解决方案&#xff0c;这种方案看题解都不一定能看明白&#xff0c;不过有个评论画图讲解的非常明白。其实仔细看题解的话&#…

Vue服务端渲染

Vue服务端渲染 一、服务端渲染基础 1、概述 我们现在可以使用Vue,React等开发SPA单页面应用&#xff0c;单页面应用的优点&#xff0c;用户体验好&#xff0c;开发效率高&#xff0c;可维护性好等。 缺点&#xff1a;首屏渲染时间长&#xff08;在客户端通过JS来生成html来…

ios搭建OpenGL环境

前言 本篇文章介绍在ios搭建OpenGL开发环境 在app的启动文章中&#xff0c;讲述了一个ios应用是如何启动的以及在IOS 13之后苹果公司推出的多窗口功能&#xff0c;通过app的启动这篇文章&#xff0c;我们基本能随心所欲的搭建一个app应用环境&#xff0c;搭建完成后的基本文件…

Vim工具使用全攻略:从入门到精通

引言 在软件开发的世界里&#xff0c;Vim不仅仅是一个文本编辑器&#xff0c;它是一个让你的编程效率倍增的神器。然而&#xff0c;对于新手来说&#xff0c;Vim的学习曲线似乎有些陡峭。本文将手把手教你如何从Vim的新手逐渐变为高手&#xff0c;深入理解Vim的操作模式&#…

高级编程 (1)

Linux软件编程: 1.Linux: 操作系统的内核 1.管理CPU 2.管理内存 3.管理硬件设备 4.管理文件系统 5.任务调度 2.Shell: 1.保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互) 2.命令解释器 3.Shell命令: …

快速理解复杂系统组成学习内容整合

目录 一、复杂系统组成 二、接入系统 (Access System) 三、应用系统 (Application System) 四、基础平台 (Foundation Platform) 五、中间件 (Abundant External Middleware) 六、支撑系统 (Supporting System) 参考文章 一、复杂系统组成 复杂系统是由多个相互关联、相…

【c++】vector用法详解

vector用法详解 vector定义vector容器的构造函数vector容器内元素的访问1.通过下标 [ ]来访问2.通过迭代器来访问3.通过范围for来访问 vector常用函数的用法解析1.size()2.clear()3.capacity()4.reserve()5.resize()6.shrink_to_fit()7.pop_back()8.push_back()9.erase()10.in…

TQ15EG开发板教程:使用vivado2023.1建立hello world工程

1:打开软件建立工程 2:使用vivado创建设计模块并生成bit文件 3:导出硬件平台&#xff0c;使用vitis建立工程 4:使用vitis创建应用程序项目 5:硬件设置与调试 1:打开软件建立工程 打开VIVADO2023.1 创建一个新的工程 输入项目名称和地址&#xff0c;下面那个选项为是否…

有关使用Lombok@Builder注解构建对象返回为空

目录 问题 原因 解决方案 问题 使用lombokBuilder注解构建对象返回结果为空 原因 Builder注解底层调用setter等方法赋值&#xff0c;你如果没加Data注解就赋值不上&#xff0c;idea也不会错误警示&#xff0c;运行也不会抛出异常&#xff0c;这个平时不注意漏掉这个点还真…

AI Partition(银灿U盘分区工具)V2.0.0.3

AI Partition(银灿U盘分区工具)V2.0.0.3.zip 复制链接下载吧 https://url20.ctfile.com/f/36743220-1017367709-67f1b9?p2024 (访问密码: 2024) 支持IS903B IS902E IS916 AI Partition(银灿U盘分区量产工具) 这个是银灿官方发布的最新版U盘分区工具&#xff0c;版本号V2.0.0…

开源浏览器Firefox:使用Docker本地部署并远程访问进行测试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 部署Firefox二. 本地访问Firefox三. Linux安装Cpolar四. 配置Firefox公网地址…

实战打靶集锦-023-oscp

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 探查ssh4.2 探查Apache4.2.1 爆破admin4.2.2 利用secret.txt 5. 提权5.1 枚举主机信息5.2 查看passwd文件5.3 枚举定时任务5.4 枚举可执行文件5.5 查看EXP5.6 Capabilities位5.7 Linpeas提权 靶机地址&#xff1a;ht…

[python]基于LSTR车道线实时检测onnx部署

【框架地址】 https://github.com/liuruijin17/LSTR 【LSTR算法介绍】 LSTR车道线检测算法是一种用于识别和定位车道线的计算机视觉算法。它基于图像处理和机器学习的技术&#xff0c;通过对道路图像进行分析和处理&#xff0c;提取出车道线的位置和方向等信息。 LSTR车道线…

深入理解网络通信和TCP/IP协议

目录 计算机网络是什么&#xff1f; 定义和分类 计算机网络发展简史 计算机网络体系结构 OSI 七层模型 TCP/IP 模型 TCP/IP 协议族 TCP/IP 网络传输中的数据 地址和端口号 MAC地址 IP 地址 端口号 为什么端口号有65535个&#xff1f; 综述 TCP 特性 TCP 三次握…

【Linux】统信服务器操作系统V20 1060a-AMD64 Vmware安装

目录 ​编辑 一、概述 1.1 简介 1.2 产品特性 1.3 镜像下载 二、虚拟机安装 一、概述 1.1 简介 官网&#xff1a;统信软件 – 打造操作系统创新生态 统信服务器操作系统V20是统信操作系统&#xff08;UOS&#xff09;产品家族中面向服务器端运行环境的&#xff0c;是一款…

外贸流程的基本流程图怎么画?这样画简单快速

外贸流程的基本流程图怎么画&#xff1f;随着全球化的不断深入&#xff0c;外贸行业逐渐成为了国家经济发展的重要支柱。对于许多企业和个人来说&#xff0c;掌握外贸基本流程是非常必要的。但是&#xff0c;很多人在初次接触外贸时&#xff0c;对于流程的各个环节并不熟悉&…

c语言--二进制和其他进制之间的转换

目录 一、前言二、二进制、十进制、十六进制、八进制的组成2.1二进制的组成2.2十进制的组成2.3八进制的组成2.4十六进制的组成 三、二进制转换为十进制3.1 二进制转换为十进制3.2十进制转换为二进制 四、二进制转八进制和十六进制4.1二进制转八进制4.2二进制转换为十六进制 五、…