第12讲-Java中的IO操作及对象的序列化与反序列化
1、知识点
1.1、课程回顾
1.2、本章重点
1.2.1 io操作
1.2.2 对象的序列化与反序列化
2、具体内容
2.1、Java IO
2.1.1、什么是IO
IO其实就是输入、输出
I InputStream 输入流
O OutputStream 输出流
Java IO即Java输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件、控制台、网络),我们还要考虑具体和它们的通信方式(顺序、随机、二进制、按字符、按字、按行等等)。Java类库的设计者通过设计大量的类来攻克这些难题(Java设计者将复杂的IO操作封装成一个个方法,那么我们再去操作IO的时候,只需要调用他们写好的方法就可以了),这个类就位于java.io包中。
在JDK1.4之后,为了提高Java IO的效率,Java又提供了一套新的IO,JavaNewIO简称JavaNIO。
2.1.3、IO分类
流:输入流 输出流
方式:字节流 字符流
IO具体的流
字节输入流InputStream、字节输出流OutputStream
字符输入流Reader、字符输出流Writer
我们如何来区分到底是输入还是输出:
读进来(reader in) 写出去(Writer Out)
2.1.4、字节输出流(将Java中的内容 输出 到文件中)
2.1.4、字节输入流(将文本中的内容 读取到Java内存)
2.1.5、循环读取数据(模拟大文件读取)
2.1.6、文件复制
2.1.7、异常处理
A 我们不讲异常抛出 而是选择try-catch
B 我们发现 关闭资源的代码是写到try中,有可能出现异常,此时close()无法执行。所以 我们需要将close()关闭资源的代码写到finally中
C 我们发现将close放到finally中的时候out和in报错。因为in和out的作用域不够。所以我们需要提高in和out的作用域。将in和out的定义写到try外面,赋值写到try的里面。
D 我们发现close()又报错了。这是因为close()也会出现异常--IOException。所以我们需要在finally中去处理close产生的异常
E 此时会出现一个隐藏的问题,就是当in和out如果为null的时候,此时执行close()代码会出现空指针异常。所以我们需要作非空判断
F 当我们的out在关闭的时候,如果出现异常,此时in就无法正常关闭了。所以 我们需要先在关闭out在out的finally中再去关闭in
总结:很麻烦 所以1.7推出了新的try-catch专门用来处理资源关闭。
2.1.8、字符流
2.1.9、包装流
2.2、序列化和反序列化
2.2.1、为什么需要序列化?
我们写的io都是将字符串与文件进行读写。如果我们有一个类People能不能将People对象写入到文件中呢?
是可以的,但是得用一个特殊的流派--对象流
此时会有异常(没有序列化异常):
java.io.NotSerializableException: com.ydj.test.People
此时 我们需要将People对象进行序列化。(理解:没有序列化,就不能进行io操作)
2.2.2、序列化的概念
Java序列化是指把Java对象转换为字节序列的过程;
而Java反序列化是指把字节序列恢复为Java对象的过程。
2.2.3、为什么需要序列化与反序列化
我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等,而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复Java对象。
当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想到Java序列化的好处。其好处一是实现了数据的持久化(将数据存储到本地文件),通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
2.2.4、如何实现Java序列化与反序列化
1、JDK类库中序列化API
java.io.ObjectOutputStream:表示对象输出流
它的writeObject()方法源输入流中读取字节序列,再把它们反序列化成一个对象,并将其返回。
2、实现序列化的要求
只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。
问题:实现了序列化接口 某个类就能进行序列化和反序列化,但是 序列化接口中什么都没有?那么实现这个接口的意义在哪?
public interface Serializable{
}
问题:序列化ID
当我们将对象写入到文件中之后
在读取的时候 如果原先的类改变了,此时会报错
java.io.InvalidClassException: com.aaa.test.People; local class incompatible: stream classdesc serialVersionUID = 5569711604535381814, local class serialVersionUID = 453780806332567972
我们存储的时候,类会默认生成一个序列化id,当读取的时候,如果类发生改变,此时,序列化id也会发生变化,然后我们读取内容,此时版本id不一样,不匹配就报错。所以 我们需要 设定版本id,防止类发生变化,以前的东西无法读取。
(功能:聊天记录,游戏存档)
第12讲-Java中的IO操作及对象的序列化与反序列化的更多相关文章
- Java中的IO操作和缓冲区
目录 Java中的IO操作和缓冲区 一.简述 二.IO流的介绍 什么是流 输入输出流的作用范围 三.Java中的字节流和字符流 字节流 字符流 二者的联系 1.InputStreamReader 2. ...
- java中的IO操作总结
一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- 2017.12.20 Java中的 IO/XML学习总结 File类详细
IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...
- java中的IO操作
IO流是用来处理设备之间的数据传输,Java对数据的操作是通过流的方式进行,而操作流的对象都封装到java.io包中.根据操作数据的种类可以把IO流分为字节流(InputStream,OutputSt ...
- java学习系列(一)Java中的IO操作
Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入\输出操作,在Java中把不同的输入\输出源抽象为"流",通过流的方式允许Java程序使用相同的方式来访问不同的输 ...
- 【转】Java中的IO操作
在使用io操作之前,先看一下java中的文件类File如何使用.File包括文件和目录,对文件和目录的操作是新建目录mkdir,新建文件createNewFile,删除文件和目录delete,以及其他 ...
- Java学习笔记——IO操作之对象序列化及反序列化
对象序列化的概念 对象序列化使得一个程序可以把一个完整的对象写到一个字节流里面:其逆过程则是从一个字节流里面读出一个事先存储在里面的完整的对象,称为对象的反序列化. 将一个对象保存到永久存储设备上称为 ...
- MessagePack Java 0.6.X List, Map 对象的序列化和反序列化
为了序列化原生的容器对象例如 List 和 Map 对象,你必须使用 Template. Template 对象是 serializer 和 deserializer 的配对.例如,为了序列化一个 ...
随机推荐
- [nghttp2]压测工具,源码编译并进行deb打包过程
编译环境:deepin 15.11桌面版 nghttp2下载地址:https://github.com/nghttp2/nghttp2 环境要求 emm只能在类Linux环境才能完整编译,想在Wind ...
- Hadoop学习(9)-spark的安装与简单使用
spark和mapreduce差不多,都是一种计算引擎,spark相对于MapReduce来说,他的区别是,MapReduce会把计算结果放 在磁盘,spark把计算结果既放在磁盘中有放在内存中,ma ...
- [Spring cloud 一步步实现广告系统] 16. 增量索引实现以及投送数据到MQ(kafka)
实现增量数据索引 上一节中,我们为实现增量索引的加载做了充足的准备,使用到mysql-binlog-connector-java 开源组件来实现MySQL 的binlog监听,关于binlog的相关知 ...
- ReentrantLock源码分析--jdk1.8
JDK1.8 ArrayList源码分析--jdk1.8LinkedList源码分析--jdk1.8HashMap源码分析--jdk1.8AQS源码分析--jdk1.8ReentrantLock源码分 ...
- Xcodebuild命令使用
Xcodebuild简介 Xcodebuild是命令行工具包的其中一项. 命令行工具包(Command Line Tools)是一个轻量的.可以与XCode分开的.在Mac上单独下载的命令行工具包. ...
- Scrum Master如何让敏捷团队正常运转?
官方<Scrum指南>中定义:Scrum Master在Scrum团队中属于服务型领导,负责践行和支持<Scrum指南>中定义的Scrum,要帮团队的每个人理解Scrum理论. ...
- javascript——原型与继承
一.什么是继承? 继承是面向对象语言的一个重要概念.许多面向对象语言都支持两种继承方式:接口继承和实现继承:接口继承只继承方法签名,而实现继承则继承实际的方法.由于函数没有签名,所以ECMAScrip ...
- 完美解决迅雷极速版强制升级到迅雷X
虽然迅雷已死,但是还是软件还是有点点用的.废话不好多说,直接上解决办法: 1. 找到桌面的迅雷图标,右键选择打开文件位置; 2. 根据路径找到: 相对路径:Thunder Network\Thunde ...
- (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
- JavaScript数组方法大全(第一篇)
数组方法大全(第一篇) 注意:第一次写博客有点小紧张,如有错误欢迎指出,如有雷同纯属巧合,本次总结参考书籍JavaScript权威指南,有兴趣的小伙伴可以去翻阅一下哦 join()方法 该方法是将数组 ...