java学习笔记15-【缓冲流、转换流、序列化流、打印流】

654BD7D9CC31FFF87AB5F6708FCCBB1D
更加强大的流都是对基本流对象的一种增强, 能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流

缓冲流也叫高效流,是对4个基本流的增强,所以也是4个 字节缓冲流 BufferedInPutStream BufferedOutPutStream 字符缓冲流 BufferedReader BufferedWriter

缓冲流的基本原理是当创建流对象的时候同时创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统io次数,提高读写效率

缓冲流是对基本流的包装所以构造方法中需要传入流对象 (4个基本流或者普通流(即普通流的子类))

字符缓冲流有两个特有方法
public String readLine() 读取一行并返回改行内容,如果没有了返回null
public void newLine() 换行

计算机中存储的数据都是二进制的,而我们平时在屏幕上看到的文字都是二进制转换后得到的,按照某种规则将二进制转换成字符或其他格式叫做编码 按照某种规则把二进制数据从字符或其他格式解析出来叫做解码
编解码的规则一致则没有问题,不一致将出现乱码的情况

字符编码:Character Encoding 就是一套自然语言的字符与二进制数之间的对应规则

字符集Charset 也叫编码表 是一个系统所支持的所有字符的集合,包括文字,标点符号,数字,图形等

计算机要准确的存储和识别各种字符集符号,必然需要进行字符编码,而每套字符集至少有一套字符编码(Unicode字符集有UTF-8,UTF-16,UTF-32三套字符编码).常用的字符集有ASCII字符集,GBK字符集,unicode字符集

当指定了字符编码后字符集就确定了,所以字符编码才是我们最终要关心的

ASCII字符集是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键,退格,换行键等)和可显示字符(英文字母,阿拉伯数字,西文符号)基本的ASCII字符集使用7个bit表示一个字符,共128个字符.ASCII的扩展字符集使用8位表示一个字符,共256个字符,方便支持欧洲常用字符

扫描二维码关注公众号,回复: 5895871 查看本文章

ISO-8859-1字符集
拉丁码表,别名latin-1,用于显示欧洲使用的语言,包括荷兰,丹麦,意大利语,德语,西班牙语等.使用单字节编码,兼容ASCII编码

GBxxx字符集 GB是国标的意思,用于显示中文而设计的一套字符集
GB2312码表(简体中文码表,双字节码表) GBK码表(最常用的中文码表,双字节编码) GB18030码表(最新的中文码表,多字节编码,1,2,4都有)

Unicode字符集
Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称统一码,标准万国码,它最多使用4个字节的数字来表达每个数字\文字或符号.有UTF-8 UTF-16 UTF-32三套编码规则.最常用的是UTF-8
UTF-8编码,使用1-4个字节为字符编码:编码规则为:
1.128个US-ASCII字符,使用一个字节编码 2.拉丁文字或字符,需要两个字节来编码 3.大部分的常用字(含中文)使用3个字节来编码 4.其他极少使用的Unicode辅助字符使用4个字节来编码

转换流 java.io.InPutStreamReader() 是Reader的子类,是字节到字符的桥梁,它读取字节并按照指定的字符集将其编码为字符,可以自己指定或按照系统默认字符集(idea默认是UTF-8,Windows默认是GBK),在构造方法中可设置字符集

序列化的概念 java提供了一种对象序列化的机制 用一个字节序列可以表示一个对象,包括对象的所有信息.字节序列写出到文件一个相当于持久保存了一个对象信息 反之,该字节序列还可以从文件中读取出来重构一个对象,称为反序列化

java.io.ObjectOutPutStream类,将java对象的原始数据类型写出到文件,实现对象的持久存储
一个对象想要序列化需要满足两个条件
1.该类必须实现序列化接口(Serializable),该接口是一个标记接口,如果未实现会报NotSerializableException
2.该类的所有属性必须是可序列化的(实现Serializable接口),如果有一个属性不需要可序列化,那么该属性必须注明是瞬态的,需要用transient关键字修饰

java.io.ObjectInPutStream类,将序列化的对象,从文件中读取,重构对象

对于JVM可以反序列化对象,它必须是可以找到class文件的类,如果找不到该类的class文件,则抛出一个ClassNotFoundException
另外当JVM反序列化对象时,如果它的字节码文件发生了变化,那么也不会反序列化成功,会报InvalidClassException
这个异常发生的原因如下:1.该类的序列版本号与从流中读取的类描述版本号不一致 2.该类包含未知数据类型 3.该类没有可访问的无参构造方法
Serializable接口给需要序列化的类提供了一个序列版本号 serialVersionUID该版本号的目的在于验证序列化的对象和对应类的版本号是否匹配

java.io.PrintStream打印流 该类能够方便地打印各种数据类型的值,是一种便捷的输出方式
构造方法,public PrintStream(String fileName) 通过传入一个文件名(或文件路径对象,或字节输出流)构造一个新的打印流
特点:1.只负责数据的输出,不负责数据的读取 2.与其他流不同,永远不会抛出io异常 3.有特有的方法 print(),println()均可以打印任意类型的值
PrintStream继承自OutPutStream,所以也可以使用父类的方法 用继承自父类的write方法时写数据时会查询编码表 97会输出a 用print方法时原样输出的

猜你喜欢

转载自blog.csdn.net/wwzzh1989/article/details/89209000
今日推荐