序列化 和 打印输出流

本文介绍了Java中的序列化和反序列化概念,强调了实现serializable接口的重要性。详细讲解了ObjectOutputStream和ObjectInputStream的使用,以及序列化过程中可能出现的问题,如transient关键字的应用和InvalidClassException异常的解决方案。此外,还探讨了PrintStream的特点,特别是其与OutputStream的关系,以及System.setOut方法的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序列化和反序列化的概述

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

要想实现对象的序列化 ,这个类必须要实现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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值