掌握 Java ObjectInputStream:反序列化对象完全指南
Java ObjectInputStream 类
ObjectInputStream 位于 java.io,用于反序列化由 ObjectOutputStream 写入的对象。继承抽象 InputStream。
ObjectInputStream 工作原理
序列化将 Java 对象转为字节流以存储或传输。反序列化由 ObjectInputStream 完成,读取字节流重建原对象。
创建 ObjectInputStream
导入类后关联源(通常为 FileInputStream):
// 关联文件
FileInputStream fileStream = new FileInputStream("example.dat");
// 包装为 ObjectInputStream
ObjectInputStream objStream = new ObjectInputStream(fileStream);
实例化后可从文件读取序列化对象。
ObjectInputStream 关键方法
read()– 读单字节readBoolean()– 读布尔值readChar()– 读字符readInt()– 读整数readObject()– 从流重建对象
示例 1:基础反序列化
写入整数和字符串到文件,再读回:
import java.io.*;
public class Main {
public static void main(String[] args) {
int data1 = 5;
String data2 = "This is programiz";
try {
// 写数据
FileOutputStream fos = new FileOutputStream("file.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(data1);
oos.writeObject(data2);
// 读数据
FileInputStream fis = new FileInputStream("file.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("Integer data :" + ois.readInt());
System.out.println("String data :" + ois.readObject());
oos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出
Integer data :5 String data :This is programiz
示例 2:反序列化自定义对象
序列化并反序列化 Dog 对象。类必须实现 Serializable。
import java.io.*;
class Dog implements Serializable {
String name;
String breed;
Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Tyson", "Labrador");
try {
// 序列化
FileOutputStream fos = new FileOutputStream("file.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog);
// 反序列化
FileInputStream fis = new FileInputStream("file.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog newDog = (Dog) ois.readObject();
System.out.println("Dog Name: " + newDog.name);
System.out.println("Dog Breed: " + newDog.breed);
oos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出
Dog Name: Tyson Dog Breed: Labrador
关键点:
- 用
ObjectOutputStream写对象 - 用
ObjectInputStream读对象 - 仅实现
Serializable的对象可序列化
ObjectInputStream 其他方法
| 方法 | 描述 |
|---|---|
available() | 返回无阻塞可读字节数 |
mark() | 标记流当前位置 |
reset() | 重置到最近标记位置 |
skipBytes(int n) | 跳过 n 字节 |
close() | 关闭流释放资源 |
深入见 官方 Java 文档。
java
- 深入理解 Java final 关键字:变量、方法与类的不可变性
- Java instanceof 运算符完全指南:用法、继承与接口检查
- 精通 Java 继承:核心概念、类型与实战示例
- 深入理解 Java 静态嵌套类:用法、差异与实战示例
- 精通 Java 匿名内部类:定义、语法与实战示例
- Java 单例模式详解:安全实现与使用指南
- 精通 Java 反射:运行时检查类、方法与字段
- 精通 Java ArrayList:操作、方法与最佳实践
- Java Stack 类全面指南:用法、核心方法与实战示例
- 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
- 掌握 Java 泛型:构建可复用、类型安全的代码
- 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除