java022数据流和对象流

一,数据流:专门用来操作基本数据类型的,数据流之外的其他流不能操作long,float,double,boolean,而数据流对八种基本数据类型都可以操作
1,DataDutputStream写数据
在这里插入图片描述

此时可以看到DataOutputStream天生不带缓冲区(不关流也可以写入数据),但是发现写入到文件中的内容是乱码
在这里插入图片描述

原因是按不同的字节数往进写,而记事本是一个一个字节的解释,所以就会把高低位分开来解释,从而生成乱码
2,DataInputStream读数据:
注意:以什么顺序写入就以什么顺序读出,否则乱码。虽然写出来的数据是乱码,但是如果按照正确的顺序是可以读出来数据的,但是如果读的时候没有按照写的顺序读,就会生成乱码。
在这里插入图片描述
二,对象流:
将数据永久保存在磁盘中或进行网络传输(前提是对象能过序列化)
在这里插入图片描述

将对象写入磁盘

在这里插入图片描述
写入的依然是乱码,毕竟字节型还是按照字节写入的。
可以看出对象流依然是不带缓冲区的

对象流在写系统内置的对象是没错的,因为他们已经实现了Serializable,

但是写我们自定义的对象必须实现Serializable,不然会报错
在这里插入图片描述
什么是Serializable接口?
首先Serializable里面没有任何方法,就是一个简简单单的标记接口,自己定义的类只有实现了该标记接口,自己的类才能被对象流ObjectOutputStream所操作。作者定义类默认都实现了该接口,我们定义的也要实现它才能被对象流操作。
数据的传送都是以二进制的形式传送的,自己定义的类实现了改接口就能转换成二进制数据,就能被对象流所操作
思考:创建一个对象只有new的方式吗?
不对,还有克隆的方式,克隆一个和他一样的

在这里插入图片描述
读的时候:已经将类写入磁盘中了,所以读的时候可以直接从磁盘读取方法属性。
在这里插入图片描述
注意:
1:如果你的属性被static,transient关键字修饰的话,那么该属性不能被写如文件中
2:如果在写入和读出的时候对象生成的序列号不一致,就会报异常

在这里插入图片描述
序列号的生成是根据对象的属性和方法生成的,属性或者方法任何一个变了,那序列号就变了
(就是读的时候不能多加属性,只要加了,序列号就会发生变化,从而报错)
如何查看序列号?
这就是个序列号
static final long serialVersionUID = -5227256158812144663L;
在dos命令中通过编译后,Serialver+类名查看序列号。

猜你喜欢

转载自blog.csdn.net/weixin_44699728/article/details/89606968