22-功能流、图形化界面

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

功能流、图形化界面

1.功能流

1.1.功能流介绍

前面学习的都是最基本的IO流对象,字节流和字符流。它们的操作规律基本是一致。

读取数据使用read方法,写数据write方法。

功能流:在IO流体系中,还有其他的流对象,这些流对象都是基于字节或者字符流而存在一些IO流,它们在字节或者字符流的基础上增强了特定的功能。当在开发中如果需要这些特定的功能,才能使用这些功能流,如果不需要这些特定功能,但还需要读写数据,那么我们依然使用前面学习的字节或者字符流操作。

学习功能流:记住每个功能流是完成什么功能即可。

1.2.Properties介绍

Properties:它本身属于Map集合体系中一员。但是它有可以和IO流结合使用。

Propertis类本身中存放的key和value这样具有一定对应关系的数据,当和IO流结合在一起的时候,可以直接将集合中的数据存储在指定的文件中,或者从文件加载数据,当数据加载完成之后,数据就已经被存放在集合中。

Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

1.2.1.Properties写数据

使用Properties和IO流结合将集合中的数据保存到文件中:

在实际开发中,我们将有对应关系的数据通过io流保存到文件中之后,在文件中得到了key=value这样的数据。

这类文件在开发中被称为配置文件。

配置文件:这个文件主要存在的价值是配置软件启动或者运行过程中需要的一些参数信息的。

key=value。在程序中我们可以通过这key得到对应的value值,进而就可以通过这个value决定软件应该如何运行以及程序应该怎么去处理接下来的问题。

例如:QQ软件:

第一次登陆QQ之后,如果选择了记住密码,下次再登陆QQ的时候,就直接显示账号和密码。而不用填写。

肯定在第一次运行QQ的过程中,将账号和密码保存到文件中。

QQ=123456

pwd=abc123

在配置文件中的以#开始的数据,称为配置文件中的注释数据,它不属于配置文件中的有效数据。

在使用Properties类和IO结合将map中的数据保存到文件中,如果map中有中文,所有的中文都会被编码。

编码的过程使用的不是本地默认的GBK编码表,而是使用的JDK中自带的unicode编码表对中文件进行的编码:在JDK中有一个命令专门负责中文字符的编码:

1.2.2.Properties读取数据

1.3.SequenceInputStream介绍

SequenceInputStream表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

SequenceInputStream它属于字节输入流。它的主要功能是将多个输入流合并成一个输入流。输入流按照先后次序进行逻辑串联。

需求:需要将三个文件中的数据合并到第四个文件中。

1.4.序列化和反序列化流

序列化和反序列化:这两个流对象可以将Java中new出来的对象直接保存到文件中。或者将保存在文件中的对象读取到程序中。

例如:Person P= new Person(“张三”,“男”,23);

序列化:将对象保存到文件中

反序列化:将文件中的对象读取到程序中。

1.4.1.序列化

ObjectOutputStream 将Java 对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

ObjectOutputStream:它可以将Java中创建出的对象(在堆内存中),直接写到文件中。

ObjectOutputStream:它可以将堆中的对象中的所有数据进行编码,转成二进制数据,但是它不能将这些二进制数据写到文件中,因此创建对象的时候,需要给其传递一个可以和底层文件交互的流对象。

上述的程序需要将Person对象持久的保存到文件中。但是运行的时候发生了异常。

在Java中当需要将一个对象持久的保存(文件、网络),Java中规定这个对象所属的类必须实现序列化接口,只要对象没有实现序列化接口在运行的时候都会发生没有实现序列化异常java.io.NotSerializableException。

异常的解决方案:让Person类实现序列化接口。

Java中定义了Serializable接口,它规定只有实现了这个接口的类的对象才能使用ObjectOutputStream实现对象的持久保存。

在Java中有部分接口中并没有任何的方法需要实现,这些接口的存在的意义仅仅是为了进行某些特定功能的限定或者是为了声明某些需要JVM检测的功能。这类接口被称为标记型接口。

1.4.

2.反序列化

ObjectInputStream 对以前使用ObjectOutputStream 写入的基本数据和对象进行反序列化。

创建ObjectInputStream对象的时候需要传递一个可以从底层读取字节的输入流,传递的字节输入流是从文件中将所有的字节读取到程序中,ObjectInputStream它是将读取到的字节数据重新解码成对应的Java对象。

反序列读取多个对象的模版代码:

1.4.3.序列化和反序列化的细节

1、当序列化的对象在被反序列化的时候,也需要依赖本地对应的class文件,如果本地的class文件和序列化时

使用的不是同一个,在反序列化过程中会发生异常。

发生上述异常的原因是:我们在序列化的时候创建的Person对象依赖的class文件是原始的。而在序列化结束之后Person的class文件被人为修改过。导致在反序列化的时候本地的Person.class文件和序列化时的不一致。

而反序列化数据的时候,需要使用一个称为版本号的数字来验证码当前的class文件和序列化时使用的是否一致。如果不一致上就发生上述的异常。

相关文档
最新文档