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

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

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

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

1.69 StreamCorruptedException

基本概念

StreamCorruptedException 表示在尝试读取或写入对象时,输入或输出流的格式不正确。通常,这种异常在对象序列化或反序列化期间出现,可能是因为流中的数据已被篡改或损坏。以下是 StreamCorruptedException 的属性、构造方法、方法和一个简单的例子:

属性:

构造方法:

  • StreamCorruptedException():创建一个新的 StreamCorruptedException 实例,其中不包含详细信息。

  • StreamCorruptedException(String reason):使用指定的详细消息创建一个新的 StreamCorruptedException 实例。

方法:

简单的例子:

javaCopy code
import java.io.*;
​
public class StreamCorruptedExceptionExample {
    public static void main(String[] args) {
        try {
            // 模拟数据被篡改的情况
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(new Person("Alice", 30));
            byte[] data = byteArrayOutputStream.toByteArray();
​
            // 修改流中的数据
            data[10] = (byte) (data[10] + 1);
​
            // 尝试从篡改后的流中读取对象
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            Object obj = objectInputStream.readObject();
            System.out.println("成功从篡改的流中读取对象:" + obj);
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("读取对象时发生 StreamCorruptedException: " + e.getMessage());
        }
    }
}
​
class Person implements Serializable {
    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 + '}';
    }
}

在这个例子中,我们首先将一个 Person 对象写入到输出流中,然后模拟了流中的数据被篡改的情况。接着,我们尝试从篡改后的流中读取对象,这时会抛出 StreamCorruptedException 异常。

应用场景

StreamCorruptedException 主要用于指示在尝试读取或写入对象时,输入或输出流的格式不正确。以下是一些可能的应用场景及其对应的代码实现:

  1. 数据完整性验证: 在进行数据传输或存储时,可以通过检查数据是否已被篡改来验证数据的完整性。

javaCopy code
import java.io.*;
​
public class DataIntegrityVerification {
    public static void main(String[] args) {
        try {
            // 模拟数据被篡改的情况
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(new Person("Alice", 30));
            byte[] data = byteArrayOutputStream.toByteArray();
​
            // 修改流中的数据
            data[10] = (byte) (data[10] + 1);
​
            // 尝试从篡改后的流中读取对象
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            Object obj = objectInputStream.readObject();
            System.out.println("成功从篡改的流中读取对象:" + obj);
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("读取对象时发生 StreamCorruptedException: " + e.getMessage());
        }
    }
}
​
class Person implements Serializable {
    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 + '}';
    }
}

在这个例子中,我们首先将一个 Person 对象写入到输出流中,然后模拟了流中的数据被篡改的情况。接着,我们尝试从篡改后的流中读取对象,这时会抛出 StreamCorruptedException 异常。

  1. 文件完整性验证: 在从文件中读取数据时,可以检查文件的校验和或哈希值,以验证文件的完整性。如果文件已被篡改,则可能会导致 StreamCorruptedException 异常。

javaCopy code
import java.io.*;
import java.security.*;
​
public class FileIntegrityVerification {
    private static final String FILE_PATH = "data.dat";
​
    public static void main(String[] args) {
        try {
            // 计算文件的哈希值
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] hash = calculateHash(md, new FileInputStream(FILE_PATH));
​
            // 修改文件内容
            modifyFileContent();
​
            // 再次计算文件的哈希值并验证
            byte[] newHash = calculateHash(md, new FileInputStream(FILE_PATH));
            if (MessageDigest.isEqual(hash, newHash)) {
                System.out.println("文件未被篡改");
            } else {
                System.out.println("文件已被篡改");
            }
        } catch (NoSuchAlgorithmException | IOException e) {
            e.printStackTrace();
        }
    }
​
    private static byte[] calculateHash(MessageDigest md, InputStream inputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            md.update(buffer, 0, bytesRead);
        }
        return md.digest();
    }
​
    private static void modifyFileContent() throws IOException {
        RandomAccessFile file = new RandomAccessFile(FILE_PATH, "rw");
        file.seek(10);
        file.writeByte(file.readByte() + 1); // 修改文件内容
        file.close();
        System.out.println("文件内容已修改");
    }
}

在这个例子中,我们首先计算了文件的哈希值,然后模拟了文件内容被篡改的情况,并再次计算了文件的哈希值。如果文件内容被篡改,则可能会导致 StreamCorruptedException 异常。

实战例子

下面是一个项目实战示例,演示了如何使用 StreamCorruptedException 来处理数据完整性验证的情况。

假设你正在开发一个简单的文件传输应用程序,该应用程序负责从服务器下载文件并验证文件的完整性。在下载文件时,如果文件的哈希值与服务器端提供的哈希值不匹配,就会抛出 StreamCorruptedException 异常,表示文件可能已被篡改。

javaCopy code
import java.io.*;
import java.net.*;
import java.security.*;
import java.util.*;
​
public class FileDownloader {
    private static final String SERVER_HOST = "example.com";
    private static final int SERVER_PORT = 12345;
    private static final String FILE_PATH = "/path/to/file.txt";
​
    public static void main(String[] args) {
        try {
            // 下载文件并验证完整性
            byte[] fileData = downloadFile();
            if (verifyIntegrity(fileData)) {
                System.out.println("文件下载成功且完整性验证通过");
            } else {
                System.out.println("文件下载成功,但完整性验证失败");
            }
        } catch (IOException | NoSuchAlgorithmException e) {
            System.out.println("文件下载失败:" + e.getMessage());
        }
    }
​
    private static byte[] downloadFile() throws IOException {
        Socket socket = new Socket(SERVER_HOST, SERVER_PORT);
        OutputStream outputStream = socket.getOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeUTF(FILE_PATH);
        objectOutputStream.flush();
​
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, bytesRead);
        }
        socket.close();
        return byteArrayOutputStream.toByteArray();
    }
​
    private static boolean verifyIntegrity(byte[] fileData) throws NoSuchAlgorithmException {
        // 从服务器获取文件的哈希值(假设服务器提供了文件的哈希值)
        String expectedHash = "54b0c58c7ce9f2a8b551351102ee0938";
​
        // 计算文件的哈希值
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] actualHash = md.digest(fileData);
​
        // 将字节数组转换为十六进制字符串
        StringBuilder actualHashStr = new StringBuilder();
        for (byte b : actualHash) {
            actualHashStr.append(String.format("%02x", b));
        }
​
        // 比较文件的哈希值与期望的哈希值
        return actualHashStr.toString().equals(expectedHash);
    }
}

在这个示例中,FileDownloader 类负责从服务器下载文件并验证文件的完整性。它通过建立与服务器的套接字连接,并发送文件路径来下载文件。下载完成后,它计算文件的哈希值并与服务器端提供的哈希值进行比较,以验证文件的完整性。如果哈希值匹配,则表示文件下载成功且完整性验证通过。如果哈希值不匹配,则可能会抛出 StreamCorruptedException 异常,表示文件可能已被篡改。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.操作系统知识

基础知识部分—Chap2 考点: 进程管理中的pv操作、死锁、银行家算法(理解); 文件管理中的路径(绝对路径和相对路径); 存储管理:了解存储管理体制的优缺点、管理结构; 1…

Gitlab光速发起Merge Request

前言 在我们日常开发过程中需要经常使用到Merge Request,在使用过程中我们需要来回在开发工具和UI界面之前来回切换,十分麻烦。那有没有一种办法可以时间直接开发开工具中直接发起Merge Request呢? 答案是有的。 使用 Git 命令方式创建 Me…

案例分析:分库分表后,我的应用崩溃了

今天我们主要分析一个案例,那就是分库分表后,我的应用崩溃了。 前面介绍了一种由于数据库查询语句拼接问题,而引起的一类内存溢出。下面将详细介绍一下这个过程。 假设我们有一个用户表,想要通过用户名来查询某个用户&#xff0…

392.判断子序列

题目:给定字符串s和t,判断s是否为t 的子序列。 字符串的一个子序列是原始字符串删除一些字符而不改变剩余字符相对位置形成的新字符串。 解题思路:s是否是 t 的子序列,因此只要能找到任意一种 s 在 t 中出现的方式,即…

2024上半年软考初级《网络管理员》报名考试全流程梳理

2024年软考网络管理员考试报名时间节点: 报名时间:上半年3月18日到4月15日,下半年8月19日到9月15日(各地区报名时间不同,具体日期见官方通告) 准考证打印时间:上半年5月20日起,下半…

C# MES通信从入门到精通(1)——串口传输文件

前言: 在上位机软件开发领域,有一些工厂的mes系统需要我们通过串口发送文件的方式把一些图片或者检测数据csv文件等发送给服务器,这种方式是一些比较旧的工厂采用的方式,但是这种方式也是存在的,本文就是讲解如何使用串口发送文件详情见下文。 1、串口发送文件思路 将需…

v-model 粗略解析

v-model 粗略解析 v-model是什么? 双向数据绑定,可以从data流向页面,也可以从页面流向data通常用于表单收集,v-model 默认绑定 value 值书写形式: v-model:value"" 或 v-model v-model原理是什么&#xf…

文献速递:深度学习乳腺癌诊断---基于深度学习的图像分析预测乳腺癌中HE染色组织病理学图像的PD-L1状态

Title 题目 Deep learning-based image analysis predicts PD-L1 status from H&E-stained histopathol ogy images in breast cancer 基于深度学习的图像分析预测乳腺癌中H&E染色组织病理学图像的PD-L1状态 01 文献速递介绍 编程死亡配体-1(PD-L1&…

基于SpringBoot的“家乡特色推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“家乡特色推荐系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 文章分享界面…

ElasticSearch之并发操作处理

写在前面 并发控制,一般有两种方案,悲观锁和乐观锁,其中悲观锁是默认每次更新操作肯定会冲突,所以每次操作都要先获取锁,操作完毕再释放锁,适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&am…

IP地址被泄露了有什么安全隐患吗

在数字时代,IP地址是我们在线身份的关键,它不仅仅是网络中的一个地址标识,更是我们数字安全的门户。黑客对IP地址的兴趣不止于其代表的数字串——它们是进入个人和企业数据宝库的钥匙。那么,当黑客得知我们的IP地址时,…

Linux 用户及用户组管理

添加用户&#xff08;useradd&#xff09; 语法&#xff1a; useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>] [-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号] -u指定用户ID&#xff…

你了解软件验收测试和确认测试的区别吗?

1、软件验收测试   软件验收测试是一个检查软件是否符合特定需求和规格的过程。它通常在软件开发的最后阶段进行&#xff0c;以确保软件的质量和可靠性。该测试的目标是验证软件是否满足用户的需求&#xff0c;并确保软件在交付前经过充分的测试和质量保证。 2、软件确认测试…

BigGait: Learning Gait Representation You Want by Large Vision Models阅读笔记

于老师团队又有新作&#xff01;&#xff01; 0 Abstract 现有的步态识别任务严重依赖上游任务所使用的多种显示步态表征&#xff08;剪影图、姿态图、点云…&#xff09;&#xff0c;会导致严高额标注成本以及累计错误&#xff1b;文章提出了BigGait框架&#xff1a; 挖掘基…

同态滤波算法详解

同态滤波是一种用于增强图像的方法&#xff0c;特别适用于去除图像中的照明不均和阴影。该算法基于照射反射模型&#xff0c;将图像分解为两个分量&#xff1a;照射分量&#xff08;illumination component&#xff09;和反射分量&#xff08;reflection component&#xff09;…

Visual Basic6.0零基础教学(3)—焦点概念和深入学习属性

焦点概念和深入学习属性 文章目录 焦点概念和深入学习属性前言一、什么是焦点(Focus)?焦点的特点 二、窗体属性一、窗体的结构二、窗体的属性三、事件四、方法 一.控件属性一. 标签 Label二.文本框 TextBox2.常用事件 三.命令按钮事件 总结 前言 今天我们来继续学习VB中的属性…

基于单片机的指纹采集识别系统设计

目 录 摘 要 I Abstract II 引 言 3 1 硬件选择与设计 5 1.1 总体设计及方案选择 5 1.1.1主控单片机选择 5 1.1.2传感器模块选择 6 1.1.3显示器模块选择 6 1.2 系统总体设计 7 2 系统硬件电路设计 8 2.1 系统主电路设计 8 2.1.1 主体电路设计 8 2.1.2 单片机最小系统设计 8 2.…

精品基于Uniapp+ssm停车场预约缴费微信小程序的设计与实现

《[含文档PPT源码等]精品微信小程序基于Uniappssm停车场微信小程序的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&…

服务器将动态IP设置成静态IP(内部网络)

话不多说,直接上干货 打开终端,输入命令行:ifconfig,查看你的网卡配置,此次设置的第一个,如下: 打开配置文件&#xff0c;一般在/etc/sysconfig/network-scripts/文件夹下&#xff1a; 编辑配置文件&#xff1a;vi ifcfg-eno1 修改IP地址分配方式&#xff1a; &#xff08;1&a…

阿里云国际配置DDoS高防(非中国内地)安全加速

DDoS高防&#xff08;非中国内地&#xff09;支持安全加速线路&#xff0c;可以实现中国内地地区用户对非中国内地业务加速访问的同时&#xff0c;提供大流量DDoS攻击防护能力。安全加速提供的清洗能力大于2 Tbps&#xff0c;可以有效保障业务访问速度和稳定性。 前提条件 您…
最新文章