|NO.Z.00085|——————————|BigDataEnd|——|Java&IO流.V12|——|Java.v12|IO流.v12|ObjectOutputStream类|概念使用|
一、ObjectOutputStream类(重点)
### --- 基本概念
——> java.io.ObjectOutputStream类主要用于将一个对象的所有内容整体写入到输出流中。
——> 只能将支持 java.io.Serializable 接口的对象写入流中。
——> 类通过实现 java.io.Serializable 接口以启用其序列化功能。
——> 所谓序列化主要指将一个对象需要存储的相关信息有效组织成字节序列的转化过程。
二、常用的方法
方法声明 | 功能介绍 |
ObjectOutputStream(OutputStream out) | 根据参数指定的引用来构造对象 |
void writeObject(Object obj) | 用于将参数指定的对象整体写入到输出流中 |
void close() | 用于关闭输出流并释放有关的资源 |
三、ObjectInputStream类(重点)
### --- 基本概念
——> java.io.ObjectInputStream类主要用于从输入流中一次性将对象整体读取出来。
——> 所谓反序列化主要指将有效组织的字节序列恢复为一个对象及相关信息的转化过程。
四、常用的
方法声明 | 功能介绍 |
ObjectInputStream(InputStreamin) | 根据参数指定的引用来构造对象 |
Object readObject() | 主要用于从输入流中读取一个对象并返回 无法通过返回值来判断是否读取到文件的末尾 |
void close() | 用于关闭输入流并释放有关的资源 |
### --- 序列化版本号
——> 序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。
——> 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应
——> 实体类的serialVersionUID进行比较,如果相同就认为是一致的,
——> 可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。
### --- transient关键字
——> transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。
——> 当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,
——> 然而非transient型的变量是被包括进去的。
### --- 经验的分享
——> 当希望将多个对象写入文件时,通常建议将多个对象放入一个集合中,
——> 然后将集合这个整体看做一个对象写入输出流中,
——> 此时只需要调用一次readObject方法就可以将整个集合的数据读取出来,
——> 从而避免了通过返回值进行是否达到文件末尾的判断。
五、编程代码
package com.yanqi.task17;
public class User implements java.io.Serializable {
private static final long serialVersionUID = -5814716593800822421L;
private String userName; // 用户名
private String password; // 密码
private transient String phoneNum; // 手机号 表示该成员变量不参与序列化操作
public User() {
}
public User(String userName, String password, String phoneNum) {
this.userName = userName;
this.password = password;
this.phoneNum = phoneNum;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
", phoneNum='" + phoneNum + '\'' +
'}';
}
}
六、编程代码
package com.yanqi.task17;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectInputStreamTest {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
// 1.创建ObjectInputStream类型的对象与d:/a.txt文件关联
ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
// 2.从输入流中读取一个对象并打印
Object obj = ois.readObject();
System.out.println("读取到的对象是:" + obj); // qidian 123456 13511258688 null
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
// 3.关闭流对象并释放有关的资源
if (null != ois) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
七、编程代码
package com.yanqi.task17;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamTest {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
// 1.创建ObjectOutputStream类型的对象与d:/a.txt文件关联
oos = new ObjectOutputStream(new FileOutputStream("d:/a.txt"));
// 2.准备一个User类型的对象并初始化
User user = new User("qidian", "123456", "13511258688");
// 3.将整个User类型的对象写入输出流
oos.writeObject(user);
System.out.println("写入对象成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4.关闭流对象并释放有关的资源
if (null != oos) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
八、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=64783:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task17.ObjectOutputStreamTest
写入对象成功!
Process finished with exit code 0
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=64789:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task17.ObjectInputStreamTest
读取到的对象是:User{userName='qidian', password='123456', phoneNum='null'}
Process finished with exit code 0
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通