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操作及对象的序列化与反序列化的更多相关文章

  1. Java中的IO操作和缓冲区

    目录 Java中的IO操作和缓冲区 一.简述 二.IO流的介绍 什么是流 输入输出流的作用范围 三.Java中的字节流和字符流 字节流 字符流 二者的联系 1.InputStreamReader 2. ...

  2. java中的IO操作总结

    一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...

  3. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  4. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  5. java中的IO操作

    IO流是用来处理设备之间的数据传输,Java对数据的操作是通过流的方式进行,而操作流的对象都封装到java.io包中.根据操作数据的种类可以把IO流分为字节流(InputStream,OutputSt ...

  6. java学习系列(一)Java中的IO操作

    Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入\输出操作,在Java中把不同的输入\输出源抽象为"流",通过流的方式允许Java程序使用相同的方式来访问不同的输 ...

  7. 【转】Java中的IO操作

    在使用io操作之前,先看一下java中的文件类File如何使用.File包括文件和目录,对文件和目录的操作是新建目录mkdir,新建文件createNewFile,删除文件和目录delete,以及其他 ...

  8. Java学习笔记——IO操作之对象序列化及反序列化

    对象序列化的概念 对象序列化使得一个程序可以把一个完整的对象写到一个字节流里面:其逆过程则是从一个字节流里面读出一个事先存储在里面的完整的对象,称为对象的反序列化. 将一个对象保存到永久存储设备上称为 ...

  9. MessagePack Java 0.6.X List, Map 对象的序列化和反序列化

    为了序列化原生的容器对象例如  List 和 Map 对象,你必须使用 Template. Template 对象是 serializer 和 deserializer 的配对.例如,为了序列化一个  ...

随机推荐

  1. Altium Designer16设置GND和VCC线宽规则的一种操作方法及注意事项

    昨天看到学弟在画电路板,看到他设置电源线线宽时出了一点问题,设置的规则最开始有作用,后来重新从原理图导入更新PCB时,电源线变绿,规则设置点更新也没有用.接下来是操作步骤: 第一步:点击Design- ...

  2. JavaScript的event对象

    JavaScript的event对象中 event.target指代的是:触发事件的元素 event.currentTarget指代的是:事件绑定的元素 <!DOCTYPE html> & ...

  3. java中什么是继承笔记

    继承 怎样实现继承:1,先提取共有的属性和方法,放到一个类里,这个叫父类.基类.超类        2.编写子类 修饰符 class 子类名 extends 父类名 好处:提高代码的复用性 子类怎么去 ...

  4. wordpress搬家 更换域名

    结论:wordpress网站文件夹是和域名相关联的 wordpress,备份了数据库 然后用另一个新域名新建站,直接从wordpress官网直接下载的网站压缩包,没有用之前的网站文件夹. 然后把原来的 ...

  5. ElasticSearch实战系列一: ElasticSearch集群+Kinaba安装教程

    前言 本文主要介绍的是ElasticSearch集群和kinaba的安装教程. ElasticSearch介绍 ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行 ...

  6. Python模块之netmiko

    一.简介 此模块用于简化paramiko与网络设备之间的ssh连接,可在windows与Unix平台使用 二.目前支持的设备 (2019.03.07) Regularly tested Arista ...

  7. Python程序包的构建和发布过程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  8. 关于selenium自动化对窗口句柄的处理

    首先什么是句柄?句柄就是你点击一个页面,跳转了一个新的窗口.你要操作的元素可能在原窗口上,也有可能在新窗口上. 看下图句柄1 句柄2 由这2张图可知,url不一样,证明他们是处于不同的界面,我要操作的 ...

  9. mave 笔记

    有时maven在myeclipse配置不好用,可直接cmd到项目目录下执行下面命令,将maven包下载到当前文件夹的lib目录下 mvn dependency:copy-dependencies -D ...

  10. HBase 系列(七)——HBase 过滤器详解

    一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...