Java中的I/O讲解(超容易理解)(下篇)

如果想观看更多Java内容 可上我的个人主页关注我,地址
子逸爱编程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/a15766649633?type=blog

使用工具 IntelliJ IDEA Community Edition 2023.1.4

使用语言 Java8 

代码能力快速提升小方法,看完代码自己敲一遍,十分有用 

目录

1.数据操作流 

1.1 DataOutputStream类和DataInputStream类 

1.2 数据操作流贯穿示例 

1.3 小结 

2. 序列化和反序列化 

2.1 序列化和反序列化

2.1.1序列化和反序列化基本概念

2.2 对象输出流ObjectOutputStream实现序列化 

2.2.1 ObjectOutputStream类的常用方法 

2.2.2 序列化贯穿示例 

2.3 对象输入流ObjectInputStream实现反序列化

2.3.1 对象输入流ObjectInputStream的基本概念

2.3.2 对象输入流ObjectInputStream的常用方法

2.3.3 反序列化贯穿示例

2.3.4 Java体系中常用流的分类


 

1.数据操作流 

前面学习的各类流实现了对文本文件的读写操作,但常见的文件读写操作还有一种二进制文件的读写操作。接下来介绍数据操作流DataOutputStream和DataInputStream,使用它们实现对二进制文件的读写操作。

1.1 DataOutputStream类和DataInputStream类 

DataOutputStream类是OutputStream类的子类,利用DataOutput类写二进制文件的实现步骤与使用FileOutputStream类写文件的步骤极其相似,而且用到了FIleOutputStream类。同样,DataInputStream类是InputStream的子类,在使用上也与FileInputStream类很相似。 

使用这个可以操作视频,图片,音频等二进制文件。 

不使用数据操作流字节流的多样性将会缩减,字节流也可以先进行缓冲流再进行数据操作流,字节缓冲输入流类名:BufferedOutputStream,字节缓冲输出流类名:BufferedInputStream,用法与字符的相同,只不过如果要使用数据操作流还要再创建一个数据操作流,然后把缓冲流作为参数丢进去(也可以不使用缓冲,直接把字节流); 

1.2 数据操作流贯穿示例 

示例代码 

运行以上这段代码将把"E:\\微信图片_20230911081149.jpg"这个路径的图片二进制文件拷到"./img/image.jpg"路径中 

1.3 小结 

DataOutputStream类可以按照与平台无关的方式(就是不管你是什么平台,Windows,Mac什么的都可以)向流中写入基本数据类型的数据,如int、float、long、double和boolean等。此外,DataOutputStream类的writeUTF()方法能写入采用UTF-8字符编码的字符串。 

FileOutputStream out1=new FileOutputStream("路径");
DataOutputStream out=new DataOutputStream(out1);
out.writeByte(1);//其他的基本数据类型也可以,改最后的数据类型就可以了
out.writeUTF("Hello");

DataInputStream类与DataOutputStream类搭配使用,可以按照与平台无关的方式从流中读取基本数据类型的数据,如int、float、long、double和boolean等。此外,DataInputStream类的readUTF()方法能读取采用UTF-8字符编码的字符串。 

FileInputStream in1=new FileInputStream("路径");
DataInputStream in=new DataInputStream(in1);
System.out.println(in.readByte());//其他的基本数据类型也可以,改最后的数据类型就可以了
System.out.println(in.readUTF()); 

2. 序列化和反序列化 

2.1 序列化和反序列化

2.1.1序列化和反序列化基本概念

在设置中的检查把这个打勾,可以在类名处按alt+enter就可以创建序列号; 

对象序列化和反序列化操作时可能会遇到版本兼容性问题。在对象进行序列化或反序列化操作的时候,要考虑JDK版本。如果序列化的JDK版本和反序列化的JDK版本不统一,就有可能发生错误。所有在序列化操作中引入了一个serialVersionUID的常量,可以通过此常量验证版本的一致性。在进行反序列化时,JVM会把传来的字节流中的serialVarsionUID与本地相应实体(类)的serialVarsionUID进行比较。如果二者相同,就认为版本是一致的,可以进行反序列化;否则会出现序列化版本不一致的异常。
当实现java.io.Serializable接口的类没有显示定义名为serialVersionUID、类型为long的变量是,Java序列化机制在编译时会自动生成一个此版本的serialVersionUID变量。如果不希望通过编译自动生成,也可以直接显示定义这个变量。
例如,可以在Person类中加入以下常量:
private static final long serialVersionUID=1L; 

序列化时包名和文件名不能为中文,要规范,不然会运行错误;

在前面的内容中实现了通过java程序读写文件。事实上,在开发中检查需要将对象的信息保存在磁盘中以便以后检索。可以将对象中的属性信息逐一记录到文本文件中,但这样程序员不得不为每一个对象编写代码;当使用时再将这些信息从文本文件中还原,这样需要对对象中的信息进行逐一处理,过程很烦琐且非常容易出错,而序列化提供了实现这个目标的便捷方法。

简单来说,序列化就是将对象的状态更轻松简单地存储到特定的存储介质中的过程,也就是将对象状态转换为可保持或可传输的过程。使用序列化的意义也在于将java对象序列化后,可以将其转换成字节序列,这些字节序列可以被保存在磁盘上,也可以借助网络进行传输,同时序列化后的对象保存的是二进制状态,这样实现了平台无关性,即可以将在Windows操作系统中实现序列化的一个对象,传输到Linux操作系统的机器上。反序列化时将特定的存储介质中的数据重新构建对象的过程,通过反序列化后得到相同对象,而无需担心数据因平台不同出现异常。

实现序列化和反序列化操作,需要使用对象操作流,下面将分别介绍对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream); 

2.2 对象输出流ObjectOutputStream实现序列化 

简单来说,对象的序列化,是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便地实现对象的传输和存储。如果一个类的对象需要被序列化,则这个对象所属类必须实现java.io.Serializable;这个一定一定不要忘记了!!!超级超级重要,没加的话是无法序列化的。 

因为在此接口中并没有定义任何方法,所以次接口是一个标识接口。一旦某个类实现了Serializable接口,该类的对象就是可序列化的。在JDK1.8类库中有些类(如String类、包装类和日期时间类等)实现了Serializable接口。现创建一个Person类,并标记该类的对象时可序列化的,代码如下: 

在上面的代码中,因为Person类已经实现了Serializable接口,所以此类的对象时可以被序列化的,而如果完成序列化操作,就还需要依靠对象输出流,他可以将对象转成二进制字节数据输出到文件中保存。

2.2.1 ObjectOutputStream类的常用方法 

ObjectOutputStream(OutputStream out)创建对象输出流对象构造方法
final void writeObject(Object obj)将指定对象写入流实例方法

2.2.2 序列化贯穿示例 

示例代码 

执行以上代码将会在""./test/user/"目录下创建一个"test1.bat"文件,然后里面就是序列化的对象;

使用普通的对象也是同理,做法相同;


以上的获取路径方法可以记一下 ;

2.3 对象输入流ObjectInputStream实现反序列化

2.3.1 对象输入流ObjectInputStream的基本概念

既然能将对象的状态保存在存储介质中,那么如何将这些对象状态读取出来呢?这就要用到反序列化。反序列化就是序列化的相反操作,序列化是将对象的状态信息保存到存储介质中的过程,反序列化则是从特定存储介质中读取数据并重新构建成对象的过程。通过反序列化,可以将存储在文件上的对象信息读取出来,然后重新构建为对象。这样就不需要再将文件上的信息一一读取、并分析,重新组织为对象。

通常,对象中的所有属性都会被序列化,但是对于一些比较敏感的信息,如用户的密码,一旦序列化,人们完全可以通过读取文件或拦截网络传输数据的方式获得这些信息。因此,出于安全考虑,某些书香苑应限制被序列化,解决的办法是使用transient关键字修改不需要序列化的对象属性。

例如,若希望Person对象中的年龄信息不被序列化,只需在Person类的age属性前添加transient关键字,如下所示
private transient int age;
在完成以上修改后,age属性将被限制序列化;

2.3.2 对象输入流ObjectInputStream的常用方法

执行反序列化操作需使用对象输入流ObjectInputStream,他可以直接把序列化后的对象还原。ObjectInputStream类的常用方法如下所示:

ObjectInputStream(InputStream in)创建对象输入流对象构造方法
final Object readObject()从指定位置读取对象实例对象

 在反序列化时,readObject()方法返回的是Object对象,因此,如果需要转换为Person对象,则需进行强制类型转换;

2.3.3 反序列化贯穿示例

示例代码 

 运行结果

 

如果序列化中的对象是普通的对象也是同理,做法相同;
如果使用序列化方式向文件中写入多个对象,那么反序列化恢复对象时,也按照写入的顺序读取。 

2.3.4 Java体系中常用流的分类

分类字节输出流字节输入流字符输出流字符输入流
基类OutputStreamInputStreamWriterReader
文件流FileOutputStreamFileInputStreamFileWriterFileReader
缓冲流BufferedOutputStreamBufferedInputStreamBufferedWriterBufferedReader
对象流ObjectOutputStreamObjectInputStream
数据操作流DataOutputStreamDataInputStream

 

所有的基类都是抽象类,无法直接创建实例,需要借助其实现类。
所有的输出流用于实现写数据操作,所有的输入流用于实现读取操作。这个输入和输出是相对程序而言的。
所有的文件流直接与存储介质关联,也就是需指定物理节点,属于节点流,其他流的创建需要在节点流的基础上进行封装,使其具有特殊的功能。例如,缓冲流在节点流的基础上增加缓冲区,对象流在节点流的基础上可实现序列化对象。
操作文本文件时,应使用字符流。字节流可以处理二进制数据,它的功能比字符流更强大。因为计算机里所有的数据都是二进制数据,如果字节流处理文本文件,还需要把这些字节转成字符,就增加了编程的复杂度,降低了执行效率。所以当输入和输出是文本文件时,尽量使用字符流。如果是二进制文件,则应考虑使用字节流。 

在实际开发中,可能会使用到其他类型的I/O流,它们也是四个抽象基类的实现类,用到时可查阅API帮助文档自行学习。 

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

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

相关文章

智能合约 之 ERC-20介绍

什么是ERC20 ERC20全称为Ethereum Request for Comment 20,是一种智能合约标准,用于以太坊网络上的代币发行 姊妹篇 - 如何部署ERC20 ERC20的应用场景 代币化资产,例如:USDT 是一种以美元为背书的ERC20代币,每个USDT代…

毅速解析:影响金属3D打印零件品质的几大核心因素

金属3D打印零件的品质,是众多因素交织影响下的结果。从设备到材料,从工艺到后处理,每一个环节都可能成为品质的决定因素。不同厂商之间品质的差异,往往就隐藏在这些看似细微的环节中。 首先,设备性能是决定金属3D打印零…

扩容分区和文件系统(Linux)

在ECS控制台上扩容云盘容量后,对应分区和文件系统并未扩容,您还需要进入ECS实例内部继续扩容云盘的分区和文件系统,将扩容部分的容量划分至已有分区及文件系统内,使云盘扩容生效。本文为您介绍如何通过两个步骤完成Linux实例云盘的…

HarmonyOS系统开发ArkTS入门案例及组件(三)

下一章 目录 一、声明式UI 二、ArkTs 快速入门案例 三、组件 四、渲染控制 一、声明式UI 声明式UI就是一种编写用户界面的范式或方式、 ArArkTS 在继承了Typescript语法的基础上,主要扩展了声明式UI开发相关的能力。 声明式UI开发范式大致流程:…

JavaWeb:AOP、配置优先级、Bean管理、SpringBoot原理、Maven高级

1 AOP 1.1 基本语法 面向切面编程、面向方面编程&#xff0c;面向特定方法编程 在管理bean对象的过程中&#xff0c;主要通过底层的动态代理机制&#xff0c;对特定的方法进行编程 应用&#xff1a;统计每一个业务方法的执行耗时 xml引入依赖 <!-- AOP-->&l…

CSS样式,1行文字溢出...省略,2行文字溢出...省略,多行文字溢出...省略

提示&#xff1a;CSS样式文字溢出…省略 文章目录 前言一、1行文字溢出...省略二、2行或多行文字溢出...省略三、1行或多行文字溢出...省略总结 前言 一、1行文字溢出…省略 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset…

华为ensp中ospf基础 原理及配置命令(详解)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言———— OSPF 的全称是 Open Shortest Path First&#xff0c;意为“开放式最短路径优先”。是一种内部网关协…

10米等高线地形图图源

让GIS更简单高效&#xff0c;让地图更丰富及时&#xff01; 最近新发现一个图源&#xff0c;这是一个有10米等高线和山体阴影的地形图数据。 我们现在将该图源加载到水经微图&#xff08;以下简称“微图”&#xff09;Web版后&#xff0c;为你分享其城区二维效果图&#xff0…

vscode中转(跳板)连接目标主机

vscode中转&#xff08;跳板&#xff09;连接目标主机 文章目录 引言正文跳转配置本地密钥 总结 引言 简单讲解如何通过vscode经过跳板机到达目标机的方式&#xff0c;本文基于linux平台&#xff0c;理论上vscode是跨平台的1。 如下本机通过两层跳板到目标主机如何通过vscode…

Jenkins安装Role-based Authorization Strategy不生效

Jenkins安装Role-based Authorization Strategy不生效&#xff0c;需开启Role-based 访问策略。 https://blog.51cto.com/zengestudy/1782494

01-JavaScript基础语法

1. 计算机基础 1.1 计算机组成 1.2 数据存储(重点) 计算机内部使用二进制 0 和 1来表示数据。 所有数据&#xff0c;包括文件、图片等最终都是以二进制数据&#xff08;0 和 1&#xff09;的形式存放在硬盘中的。 所有程序&#xff0c;包括操作系统&#xff0c;本质都是各种…

马斯克开源Grok-1

Grok-1是由马斯克AI创企xAI发布的第一代大语言模型&#xff0c;它以其巨大的参数量——高达3140亿&#xff0c;引起了全球范围内的广泛关注。这一参数量远超其他知名模型&#xff0c;如OpenAI的GPT-3.5&#xff0c;后者仅有1750亿参数。在2024年3月17日&#xff0c;马斯克宣布将…

js和go的列表转树形, 执行速度测试对比

js代码&#xff0c;浏览器上运行 // 列表转树形 export function deepTree(list: any[]): any[] {const newList: any[] [];const map: any {};for (let index 0; index < list.length; index) {const e list[index];map[e.id] e;}for (let index 0; index < list…

【Android】系统启动流程分析 —— init 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程&#xff0c;准确的说&#xff0c;它是 Linux 系统中用户控制的第一个进程&#xff0c;它的进程号为 1&#xff0c;它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…

第四讲 Buffer Pool

问题&#xff1a;DBMS 是如何管理其内存和磁盘之间来回移动数据的&#xff1f; 答案&#xff1a;在决定如何在磁盘中来回移动数据时&#xff0c;我们必须考虑两个关键方面&#xff1a; 空间控制【Spatial Control】&#xff1a; 将页【pages】写在在磁盘的什么地方&#xff…

线性表:关于链表(主要以单链表为例)的相关理解和应用

多清澈这天空 晴雨相拥 同心逐梦&#xff01; 坚守我信心 一路出众&#xff01;&#xff01; 首先&#xff0c;按照惯例&#xff0c;欢迎大家边听歌边观看本博客 ▶ 紫荆花盛开 (163.com)&#xff08;建议复制链接&#xff0c;浏览器打开&#xff0c;csdn打开太慢了&#x…

吉时利keithley 2604B数字源表

181/2461/8938产品概述&#xff1a; Keithley 2604B 源表可让您比以前更快、更轻松、更经济地进行精密直流、脉冲和低频交流源测量测试。Keithley 2604B 的 IV 功能测试测试速度是竞争产品的两到四倍&#xff0c;其结合了&#xff1a; Keithley 的高速第三代源测量单元 (SMU)…

Linux学习-进程

目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例&#xff1a;创建九个子进程 目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例&#xff1a;创建九个子进程 exec函数…

Typecho博客后台登陆界面美化

登录界面&#xff1a; 食用方法&#xff1a; 备份 admin 目录 压缩包内容上传到 admin 目录内。 结构:网站根目录 /admin/login.php 结构:网站根目录 /admin/style 修改 login.php 第35行&#xff0c;把“季春二九管理后台”替换成自己的信息 清理缓存&#xff0c;开始体验新的…

罐头鱼AI矩阵获客批量混剪运营系统介绍

罐头鱼AI矩阵——智能运营系统助力抖音视频创作 随着社交媒体的普及&#xff0c;视频内容创作成为了企业营销的重要手段。为了帮助您更高效地进行视频内容创作和发布&#xff0c;我们推出了罐头鱼AI矩阵&#xff0c;一款集智能混剪、关键词生成、发布管理等功能于一体的全新运营…