(每日持续更新)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;}
​@Overridepublic 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;}
​@Overridepublic 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.mzph.cn/news/743984.shtml

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

相关文章

vue-vben-admin的编译运行

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统RuoYi-Nbcio亿事达企业管理平台 gitee源代码地址 后端代码:…

变量的本质和命名规则

变量的本质 内存:计算机中存储数据的地方,相当于一个空间变量本质:是程序在内存中申请的一块用来存放数据的小空间 变量命名规则与规范 规则: 不能用关键字 关键字:有特殊含义的字符,JavaScript 内置的一些英语词汇。例如:let、var、if、for等>只…

掌握AI技术,轻松学习游戏开发

进入游戏开发的世界,就像打开了一扇通往未来的大门,而掌握AI技术正是这扇门的钥匙。随着AI技术在游戏行业的迅速崛起,它不仅为游戏设计和用户体验带来了革命性的改变,更为新入行者展示了一个充满创新和机遇的领域。特别是百川智能…

缓存把我坑惨了..

故事 春天,办公室外的世界总是让人神往的,小猫带着耳机,托着腮帮,望着外面美好的春光神游着… 一声不和谐的座机电话声打破这份本该属于小猫的宁静,“hi,小猫,线上有个客户想购买A产品规格的商…

SOLIDWORKS2024 | 轻松处理制造复杂几何体和有机形状

如今,工程师面临各种各样的挑战。预算紧缩的同时,排期也越来越短。客户需要智能、互联的产品,这一需求掀起了各行各业添加软件和电子模块的趋势。产品须变得更快、更轻、更好。在所有这些变化中,几何体也变得越来越复杂。 从工作…

InstantID Zero-shot Identity-Preserving Generation in Seconds

InstantID: Zero-shot Identity-Preserving Generation in Seconds TL; DR:InstantID IP-Adapter (Face) ControlNet,实现了具有较高保真度的人脸 ID 生成。 方法 InstantID 想做到的事情是:给定一张参考人脸 ID 图片,生成该…

基于单片机的电子秤设计

摘 要 本文设计了一种以51单片机来进行控制的电子秤系统,系统的电路部分由以下几个电路模块组成:数据采集和数据处理电路、模数转换电路、LED及蜂鸣器报警电路、最小系统电路、液晶显示电路、矩阵按键电路等。接通电源后,单片机会把压力传感…

抠图透明背景怎么做?3种方法教你抠图换背景

抠图透明背景怎么做?抠图透明背景是一项在图像处理中常见的任务,它可以帮助我们去除图片中的多余部分,使主体部分与背景分离,从而得到一个透明背景的效果。这一技巧在多个领域都有广泛应用,掌握这种技巧,不…

C++第四弹---类与对象(一)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 类与对象 1、面向过程和面向对象初步认识 2、类的引入 3、类的定义 4、类的访问限定符及封装 4.1、访问限定符 4.2、封装 5、类的作用域 6、类的…

如何在WordPress网站上设置多语言展示

在今天的全球化世界中,拥有多语言网站对于吸引更广泛的受众至关重要。前不就我们遇到Hostease的客户咨询我们的在线客服,他想要对他的wordpress网站支持多语言。我们提供给客户可以尝试以下的插件来支持多语言。 在本教程中,我们将逐步介绍如…

【PCB 小工具】saturnpcb

saturnpcb 官网 打开长这样子; 上面是老版本;看下最新的 推荐还是官方下载 有人在说 这玩意需要在设置板材时候选择;

软件杯 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

什么是大顶堆?举个例子

一、什么是大顶堆? 大顶堆(Max Heap)是一种二叉堆的实现,它满足以下性质: 任意节点的值都大于等于其子节点的值。根节点(堆顶)的值是整个堆中最大的。 大顶堆通常用于实现优先队列等数据结构…

嘿!终于等到了!应用开发云资源套餐如约而至!

MemFire Cloud平台更新啦!!此次更新我们推出了万众期待的计费套餐,下面给大家带来详细的介绍~ 计费模式为“基础套餐按量付费”,您可选择购买带有一定配额的基础套餐,超出配额部分可以通过开启“超限按量”功能来转为…

AbilityStorage理解与反思

1.简介: AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。 2.那么Module分为三类:Hap,Har,Hsp 官网上的表述容易误解:实际上AbilitySta…

表单修饰符和事件修饰符

表单修饰符和事件修饰符 表单修饰符 v-model.lazy v-model.lazy 失去焦点后再收集数据 <div id"app"><textarea name"" id"" cols"30" rows"10" v-model.lazy"a"></textarea>{{a}}<textar…

【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data

论文标题&#xff1a;Depth Anything Unleashing the Power of Large-Scale Unlabeled Data 论文地址&#xff1a;https://arxiv.org/pdf/2401.10891.pdf 项目主页&#xff1a;https://depth-anything.github.io/ 演示地址&#xff1a;https://huggingface.co/spaces/LiheYoung…

PyCharm 中 Python 解释器的配置

温馨提示&#xff1a;本文 PyCharm 版本是 2022.3.3 前言 作为 Python 新手&#xff0c;在了解了基本语法之后&#xff0c;肯定得先用 IDE 工具写个 Hello World&#xff0c;来了解 Python 编程语法及 IDE 工具的常规配置和使用&#xff0c;这里我用的 IDE 工具是 PyCharm。 …

unicloud update 修改

update 修改 使用腾讯云时更新方法必须搭配doc、where方法使用&#xff0c;db.collection(‘test’).update()会报如下错误&#xff1a;param should have required property ‘query’ collection.doc().update(Object data)未使用set、remove更新操作符的情况下&#xff0c…

如何通过libusb直接向zebra打印机发送zpl,跨平台win/linux

环境&#xff1a;windows & linux & Zebra打印机gt820 windows: 之前安装了Zebra打印机官方驱动&#xff0c;所以先卸载掉驱动。再安装Zadig&#xff0c;用Zadig工具来安装WinUSB驱动。 zadig下载&#xff1a;Zadig - USB driver installation made easy 记住这两个数…