序列化 和 打印输出流

自作多情 提交于 2020-03-04 05:11:01

序列化和反序列化的概述

序列化就是把对象存储到文件中。

要想实现对象的序列化 ,这个类必须要实现serializable接口(充当一个标记作用)

有了这个标记,在序列化时,系统会自动分配一个序列号(用作校对序列前后,也可手动指定)

对象序列化流

ObjectOutPutStream (对象输出流) 和 ObjectInputStream (对象输入流)

ObjectOutPutStream (对象输出流)

ObjectOutPutStream 继承自 OutPutStream类

它特有的方法: writerObject()

调用此方法 将对象写入到文件中

// 使用步骤
/*1、先创建一个ObjectOutputStream对象,构造方法传入一个FileOutputStream(指定序列化后输出地址)
2、调用特有方法 wirterObject 方法 写入文件
3、释放资源
*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“c:\\abc.txt”));
oos.writerObject(new student("xiaoming",12)); // 写入一个自定义对象 student 
oos.close();  //3、释放资源

ObjectInputStream (对象输入流)

ObjectInputStream 继承自 InputStream类

它特有的方法: readObject()

调用此方法 将文件中读取对象到内存中

序列化会出现的问题

transient 关键字

若类中的某些成员变量,不想暴露出原有的数值,则可以考虑使用 transient 关键字修饰变量(能被访问到,但原有数值被默认值0覆盖)

InvalidclassException 异常

出现了 InvalidclassException 异常,意味着序列化前和序列化后的序列号(默认由系统分配)不一致

为何出现异常?

因为序列化前系统会分配给类一个序列号(A1),后来又对类进行了修改,此时系统再次分配一个序列号(B2)

这时候,对其进行反序列得出的序列号跟原来的不一致(A1 – B2)。

如何解决?

在类中指定一个序列号 serialVersionUID

private static final long serialVersionUID = 1L;// 手动指派 

PrintStream打印输出流

特点

只能读,不能写

它本身就具有打印字符的方法

常用的 print println

由于它继承自 OutputStream 类 有 writer 方法

print writer 方法各不相同

print() 直接输出 括号里面的内容

writer() 会把括号里面的内容,进行查找码表进行解码 ( 97 -> a )

System 的 setOut方法

调用此方法可以重定义输出 打印流内容

System.out.print("打印在控制台显示")//创建输出流对象
PrintStream ps = new  PrintStream(“c:\\abc.txt”);
//重新定义输出流方向
System.setOut(ps);
System.out.print("我将会在abc文本文件中存在")//释放资源
ps.close();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!