Java ObjectInputStream 类用法说明及实例
本教程通过示例介绍 Java ObjectInputStream 类以及使用方法。
本教程通过示例介绍 Java ObjectInputStream 类以及使用方法。
java.io
包的 ObjectInputStream
类可用于读取以前由 ObjectOutputStream
序列化的对象数据。
ObjectInputStream
类扩展了 InputStream
抽象类。
在了解 ObjectInputStream
类之前,请先了解 ObjectOutputStream
类。
ObjectInputStream 原理
ObjectInputStream
主要用于读取 ObjectOutputStream
写入的数据。
ObjectOutputStream
将 Java 对象转换为相应的流。这称为序列化。这些转换后的流可以存储在文件中或通过网络传输。
现在,如果我们需要读取这些对象,我们要使用 ObjectInputStream
将流转换回相应的对象。这称为反序列化。
创建 ObjectInputStream
我们可以通过以下方式创建对象输入流:
// 创建一个文件输入流关联到文件
FileInputStream fileStream = new FileInputStream(String file);
// 使用对象输入流包装文件输入流
ObjectInputStream objStream = new ObjectInputStream(fileStream);
在上面的例子中,我们创建了一个名为 objStream
的对象输入流, 它与名为 fileStream
的文件输入流关联。
现在, objStream
可以从文件中读取对象了。
ObjectInputStream 的方法
ObjectInputStream
类实现了的 InputStream
类中的定义的所有的抽象方法。
read() 方法
read()
- 从输入流中读取一个字节的数据readBoolean()
- 以布尔形式读取数据readChar()
- 以字符形式读取数据readInt()
- 以整数形式读取数据readObject()
- 从输入流中读取对象
示例 1:Java ObjectInputStream
让我们看看如何使用 ObjectInputStream
该类来读取 ObjectOutputStream
类写入的对象。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) {
int data1 = 5;
String data2 = "Hello World.";
try {
FileOutputStream file = new FileOutputStream("file.txt");
ObjectOutputStream output = new ObjectOutputStream(file);
// Writing to the file using ObjectOutputStream
output.writeInt(data1);
output.writeObject(data2);
FileInputStream fileStream = new FileInputStream("file.txt");
// Creating an object input stream
ObjectInputStream objStream = new ObjectInputStream(fileStream);
//Using the readInt() method
System.out.println("Integer data : " + objStream.readInt());
// Using the readObject() method
System.out.println("String data: " + objStream.readObject());
output.close();
objStream.close();
} catch (Exception e) {
e.getStackTrace();
}
}
}
输出
Integer data : 5
String data: Hello World.
在上面的例子中,我们首先使用 ObjectOutputStream
将整数数据和对象数据写入文件,然后使用 ObjectInputStream
类的 readInt()
和 readObject()
方法从文件中读取整数数据和对象数据。
示例 2:Java ObjectInputStream
让我们看另一个实际例子,
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Dog implements Serializable {
String name;
String breed;
public Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
}
public class Main {
public static void main(String[] args) {
// Creates an object of Dog class
Dog dog = new Dog("Tyson", "Labrador");
try {
FileOutputStream file = new FileOutputStream("file.txt");
// Creates an ObjectOutputStream
ObjectOutputStream output = new ObjectOutputStream(file);
// Writes objects to the output stream
output.writeObject(dog);
FileInputStream fileStream = new FileInputStream("file.txt");
// Creates an ObjectInputStream
ObjectInputStream input = new ObjectInputStream(fileStream);
// Reads the objects
Dog newDog = (Dog) input.readObject();
System.out.println("Dog Name: " + newDog.name);
System.out.println("Dog Breed: " + newDog.breed);
output.close();
input.close();
} catch (Exception e) {
e.getStackTrace();
}
}
}
输出
Dog Name: Tyson
Dog Breed: Labrador
在上面的例子中,我们创建了
- 一个
Dog
对象 - 一个
ObjectOutputStream
对象,它使用FileOutputStream
对数据写入文件 - 一个
ObjectInputStream
对象,它使用FileInputStream
读取文件中的数据
! 注意:Dog
类实现 Serializable
接口。这是因为 ObjectOutputStream
仅将可序列化 Serializable
接口的实现类。
ObjectInputStream 的其他方法
方法 | 说明 |
---|---|
available() |
返回输入流中的可用字节数 |
mark() |
标记输入流中已读取数据的位置 |
reset() |
将控制返回到输入流中设置标记的位置 |
skipBytes() |
从输入流中跳过并丢弃指定的字节 |
close() |
关闭对象输入流 |