(每日持续更新)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等>只…

Jenkins入门指南:自动化构建与部署的艺术

概要: 本篇博客旨在为新手提供一个全面、易懂的Jenkins入门指南。我们将从Jenkins的基本概念讲起,逐步深入到安装、配置、以及如何使用Jenkins来自动化软件的构建、测试和部署过程。内容将涉及Jenkins的核心功能,插件管理,以及与…

代码随想录-动态规划7(139. 单词拆分)

139. 单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(s.size()1, false);unordered_set<string> wordDict_set;for (int i0; i<wordDict.size(); i){wordDict_set.insert(wordDict[i]);}dp…

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

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

HTML CSS学习

# html css 日常学习记录---学习途径--渡一教育-袁老师# 元素包含关系 以前&#xff1a;块级元素可以包含行级元素&#xff0c;行级元素不可以包含块级元素&#xff0c;a元素除外 元素的包含关系由元素的内容类别决定。 例如&#xff0c;查看h1元素中是否可以包含p元素 总…

缓存把我坑惨了..

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

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

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

InstantID Zero-shot Identity-Preserving Generation in Seconds

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

基于单片机的电子秤设计

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

DeepSeek发布多模态大型语言模型DeepSeek-VL,技术创新性突出

近日,DeepSeek团队发布了一项创新性突出的多模态大型语言模型DeepSeek-VL。该模型参数规模为1.3B和6.7B,采用了创新的联合视觉和语言预训练方法,旨在解决传统的单模态预训练方法的局限性。 DeepSeek-VL在数据准备、模型架构和训练方法等多方面都有创新工作。在数据准备方面,采用…

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

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

OMP(Orthogonal Matching Pursuit,正交匹配追踪)算法

OMP(Orthogonal Matching Pursuit,正交匹配追踪)算法,这是一种在信号处理和压缩感知领域经常使用的算法,特别适用于从稀疏信号中恢复出信息。 示例 我们可以通过一个简化的例子来理解它: 想象你有一本非常厚的书,这本书里充满了各种故事。但现在,你只能通过书中的一…

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

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

并发支持库(2)-原子操作

c中的原子用于实现对象的线程安全的操作&#xff0c;避免数据竞争&#xff0c;每一个原子操作可以看作一个不可分割地整体。 本文章的代码库&#xff1a;https://gitee.com/gamestorm577/CppStd atomic atomic是一个类模板&#xff0c;每个atomic模板的实例化都定义了一个原…

电动汽车安全吗?

新能源汽车通常搭载电池系统、电驱动系统以及电控系统&#xff0c;这些部件的安全性能直接关系到整车的安全性。 电动汽车的安全要求通常由国际、国家或地区性的标准和规范来定义和规范。以下是一些常见的电动汽车安全标准&#xff1a; ISO 6469 系列标准&#xff1a;ISO&…

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

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

【PCB 小工具】saturnpcb

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

软件杯 深度学习 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 前言 &#x1f525; 优质…

【Javaweb】【瑞吉外卖】上传下载实现

上传文件 原理&#xff1a;前端让用户选择一个文件&#xff0c;点击丢给后端上传&#xff0c;后端servlet接收到这些请求就进行应答构建连接&#xff0c;完了就开始接收。 但实现这些原理可以不是很懂。servlet封装了一下&#xff0c;spring boot也封装了一下。实现就比较简单…