IO相关知识(Filter/序列化)

news2024/9/28 20:05:24

1.Filter模式

a.简介

        i.直接使用继承,为各种InputStream附加更多功能,根本无法控制代码的复杂度,很快就会失控。
        ii.为了解决依赖继承会导致子类数量失控的问题,JDK首先将InputStream分为两大类:
                1.提供数据的基础的InputStream
                        a.FileInputStream:文件
                        b.ByteArrayInputStream:数组
                        c.ServletInputStream:网络
                2.提供额外附加功能的InputStream
                        a.BufferedInputStream:缓冲
                        b.DigestInputStream:计算签名
                        c.CipherInputStream:加/解密
        iii.通过一个“基础”组件再叠加各种“附加”功能组件的模式,称为Filter模式(或者装饰器模式:Decorator)。 它可以通过少量的类来实现各种功能的组合。

b.编写FilterInputStream

        i.可以把自己的FilterInputStream叠加到任何一个InputStream中。
        ii.叠加多个FilterInputStream,我们只需要持有最外层的InputStream。try(resource)语法,外层内层的InputStream的close()方法都会调用,所有资源都会关闭,因此不存在资源泄露。
        iii.编写一个CountInputStream,对输入的字节进行计数。

c.总结

        i.Java的IO标准库使用Filter模式为InputStream和OutputStream增加功能:
                1.可以把一个InputStream和任意个FilterInputStream组合。
                2.可以把一个OutputStream和任意个FilterOutputStream组合。
        ii.Filter模式可以在运行期动态增加功能(又称Decoartor模式)。

2.序列化

a.简介

        i.序列化是把一个Java对象变成二进制内容(byte[]数组);反序列化是把一个二进制内容(byte[]数组)变回Java对象。
        ii.Java对象序列化后可以把byte[]保存到文件中,或把byte[]通过网络传输到远程。
        iii.Java对象序列化,需实现java.io.Serializable接口。
        iv.Serializable没有定义任何方法,是一个空接口,称为“标记接口”(Marker Interface),实现了标记接口的类仅仅是给自身贴了个“标记”,没有增加任何方法。

b.序列化

        i.把一个Java对象变为byte[]数组,需要使用ObjectOutputStream。它负责把一个Java对象写入一个字节流。ObjectOutputStream可以写入基本类型,String,实现了Serializable接口的Object。

c.反序列化

        i.ObjectInputStream负责从一个字节流读取Java对象。可以读基本类型和String,调用readObject()可以直接返回一个Object对象,要把它变成特定类型,必须强制转型。

        ii.readObject()可能抛出的异常
                1.ClassNotFoundException:没有对应的Class。即序列化时传的Person对象,在反序列化程序中没有。
                2.InvalidClassException:Class不匹配。即序列化时Person类的age定义的是int,反序列化时Person类的age定义的是long,导致class不兼容。
        iii.为避免这种class定义导致的不兼容,Java的序列化允许class定义一个特殊的serialVersionUID静态变量。
        iv.反序列化时,由JVM直接构造出Java对象,不调用构造方法,构造方法内部的代码,在反序列化时根本不执行。

d.安全性

        i.Java的序列化机制可以导致实例直接通过byte[]数组创建,不调用构造方法。byte[]数组被反序列化后可执行特定的代码,存在安全隐患。
        ii.Java的序列化和反序列化机制即存在安全性问题,又存在兼容性问题。更好的序列化方法是通过JSON这样的通用数据结构来实现,只输出基本类型(包括String)的内容,不存储任何代码信息。
        iii.序列化机制仅适应于Java,需要与其他语言交换数据,必须使用通用的序列化方法,例如JSON。

3.操作Zip

a.简介

        i.ZipInputStream是一种FilterInputStream。
        ii.ZipOutputStream是一种FilterOutputStream。

b.读取zip包

        i.FileInputStream作为数据源,循环调用getNextEntry(),返回null,表示zip流结束。
        ii.一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,就用read()方法不断读取,返回-1表示结束。

c.写入zip包

i.ZipOutputStream可以直接写入内容到zip包,包装一个FileOutputStream,写入每个文件前,先调用putNextEntey(),然后用write()写入byte[]数据,最后调用closeEntry()结束这个文件的打包。
 

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

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

相关文章

SpringBoot+Activiti7工作流入门实例

目录 文章目录 目录准备Activiti建模工具1、BPMN-js在线设计器1.1 安装1.2 使用说明1.3运行截图 2、IDEA安装Activiti Designer插件2.1安装插件2.2 设置编码格式防止中文乱码2.3 截图 简单工作流入门实例1. 新建Spring Boot工程2. 引入Activiti相关依赖添加版本属性指定仓库添加…

10.1软件工程知识详解上

软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成…

一文上手SpringSecuirty【六】

自定义认证流程完成之后,前端收到了后端生成的token,那么在之后的所有请求当前,都必须携带token.作为服务器来说,得验证这个token,是否合法. 一、验证token是否合法 1.1 OncePerRequestFilter过滤器 OncePerRequestFilter是 Spring 框架中的一个过滤器,用于确保在…

强化-极限

不利于元素及时提现 要学会构建导数(按照定义)

老挝旅游如何解决沟通问题?《老挝语翻译通》app支持语音识别翻译功能,能有效解决语言不同的痛点

老挝,一个东南亚的神秘国度,以其独特的文化和语言吸引着全球旅行者和语言爱好者。为了帮助大家更好地了解和学习老挝语,我们推出了《老挝语翻译通》App,一款集翻译、学习、旅游于一体的多功能工具。 功能亮点 实时翻译&#xff1…

滚珠丝杆如何安装滚珠?

滚珠丝杆安装滚珠是一门非常专业的知识,其安装过程需要细致且精确,这样才能确保其后续运行的顺畅与稳定。以下是安装滚珠的详细步骤: 一、准备工作 确保工作区域清洁无尘,准备合适的螺丝刀、扳手等工具,以及适量的润滑…

win10文件共享设置 - 开启局域网文件共享 - “您没有权限访问,请与网络管理员联系请求访问权限”解决方案

实现步骤: 1、在“网络和共享中心”关闭“密码保护的共享” 2、在“启用和关闭windows功能”中开启SMB文件共享支持。 3、在磁盘安全选项中添加“everyone”用户(重点!) 详细操作: https://blog.csdn.net/Skyirm/a…

怎么不用付费直接编辑pdf?5款pdf在线编辑器免费推荐给你!

在我们日常工作中,可能会经常需要直接编辑修改pdf内容,例如,在将文档发送给其它人之前,您可能需要进行一些修改;或者当扫描的文本出现错误时,您也需要进行修正。此时,如果有一款在线编辑器&…

【笔记】7.1 小功率整流滤波电路

一、 单相整流电路 任务:把正弦电压转变为单向脉动的电压。 类型:有单相半波、全波、桥式和倍压整流等。 分析方法:为分析简单起见,把二极管当作理想元件处理,即二极管的正向导通电阻为零,反向电阻为无穷…

北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级

随着国家对应急通信和精准定位技术的重视程度不断提高,相关技术和设备的研发与应用也得到了迅猛发展。特别是在边防巡逻、林业巡防、海上作业等领域,通信设备的可靠性和功能性直接关系到人员的生命安全和任务的成功完成。 近年来,我国政府高度…

软件测试面试100问(含答案+文档)

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决? 首先,将问题提交到缺陷管理库里…

py 元组,列表,函数的学习和使用

代码 下面两个Python脚本&#xff0c;分别解决问题。 1. 脚本 test1.ipynb # 创建一个元组 t1 和一个空列表 list1 t1 (1, 2, R, py, Matlab) list1 [] # 使用 while 循环&#xff0c;将 t1 中的元素添加到 list1 i 0 while i < len(t1): list1.append(t1[i]) …

计241 作业2:C程序设计初步

问题 A: C语言实验——计算AB&#xff08;顺序结构&#xff09; 思路讲解: 这个直接计算ab就好&#xff0c;没有什么困难的&#xff0c;用来熟悉环境最适合不过 代码实现: #include<stdio.h>int main() {int a,b;scanf("%d %d",&a,&b);printf("…

时间技能物品竞品抢拍拍卖发布h5公众号小程序开源版开发

时间技能物品竞品抢拍拍卖发布h5公众号小程序开源版开发 利用新型营销方式&#xff0c;将闲置的物品通过拍卖&#xff0c;让价格一提再提让用户趣在其中&#xff0c;营造一种不一样的购物体验! 拍卖列表页 列表页采用多分类&#xff0c;广告轮播及流动公告和拍卖商品列表组成…

2024年9月26日 linux笔记

1、提示符 1.1 提示符 1.2 命令格式 1.3 路径 2、指令 2.1 pwd 显示当前路径 2.2 cd 切换路径、改变路径 2.3 mkdir 创建目录 [-p] 创建目录及子目录 mkdir -p dir1/dir2 2.4 rmdir 删除目录 &#xff08;注&#xff1a;不能删除空目录&#xff09; 2.5 ls 显示当前目录文…

设计模式之策略设计模式

一、状态设计模式概念 策略模式&#xff08;Strategy&#xff09; 是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 适用场景 当你想使用对象中各种不同的算法变体&#xff0c; …

构建Python机器学习模型的8个步骤

本文旨在系统地介绍构建机器学习模型的基本步骤&#xff0c;并通过一个具体的实战案例——股票价格预测&#xff0c;展示这些步骤的实际应用。通过遵循这些步骤&#xff0c;读者可以更好地理解和掌握机器学习模型构建的全过程。 步骤一&#xff1a;定义问题 首先&#xff0c;我…

【移植】一种快速移植OpenHarmony Linux内核的方法

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开…

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠&#xff0c;那么将他们的 值相加作为节点合并后的新值&#xff0c;否则不为 NUL L…

如何选择主数据管理系统平台

企业数据量呈现爆炸式增长&#xff0c;多系统并存、数据分散的现象日益普遍。主数据管理&#xff08;MDM&#xff09;作为确保企业核心业务数据准确、一致、完整的关键环节&#xff0c;对于企业的决策制定、业务流程优化和数据分析至关重要。而选择一个合适的主数据管理系统平台…