ObjectInputStream 怎么理解
时间: 2024-03-24 21:25:39 浏览: 27
ObjectInputStream 是 Java 提供的一个类,用于将 Java 对象从输入流中读取并反序列化。它的作用是将 Java 对象转换成字节流,以便于在网络上传输或者写入到本地文件中。
通常情况下,我们需要将 Java 对象进行序列化,以便于在网络传输或者存储到本地文件中。这时候就可以使用 ObjectOutputStream 将 Java 对象序列化成字节流,并将字节流写入到网络或者本地文件中。而当需要读取这些对象时,则可以使用 ObjectInputStream 从输入流中读取字节流,并将其反序列化成 Java 对象。
ObjectInputStream 可以读取字节数组、文件和 Socket 等输入流中的对象。它提供了一系列的读取方法,如 readObject()、readBoolean()、readInt() 等,可以根据需要读取不同类型的对象。
总之,ObjectInputStream 是 Java 中一个非常重要的类,它使得我们能够方便地将 Java 对象序列化和反序列化。
相关问题
程序功能:编写SerializationTest.java和DeserializationTest.java程序,利用ObjectOutputStream将 student 类的实例对象信息保持到 E:\IOTest\objectSeri.dat 文件,再利用ObjectInputStream将文件中的对象信息显示出来。
好的,我理解了你的要求。下面是实现这个程序的代码:
首先是 `Student` 类的定义:
```java
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
private String gender;
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
```
然后是 `SerializationTest` 类,用于将 `Student` 对象序列化并写入文件:
```java
import java.io.*;
public class SerializationTest {
public static void main(String[] args) {
Student student = new Student("张三", 18, "男");
File file = new File("E:/IOTest/objectSeri.dat");
try (OutputStream outputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
objectOutputStream.writeObject(student);
System.out.println("序列化成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
最后是 `DeserializationTest` 类,用于从文件中读取并反序列化 `Student` 对象:
```java
import java.io.*;
public class DeserializationTest {
public static void main(String[] args) {
File file = new File("E:/IOTest/objectSeri.dat");
try (InputStream inputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
Object object = objectInputStream.readObject();
if (object instanceof Student) {
Student student = (Student) object;
System.out.println(student.toString());
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
注意,在序列化和反序列化过程中,要使用相同的文件和流对象,否则会导致读取失败。
希望这个程序能够满足你的需求。如果有任何问题,欢迎随时提出。
序列化反序列化理解java示例代码
序列化是将对象转换为字节流,以便可以将其保存到文件或将其传输到网络。反序列化是将字节流转换回对象。
下面是一个简单的示例代码,演示如何将一个对象序列化并将其保存到文件中,然后再将其反序列化为原始对象。
```java
import java.io.*;
public class SerializationDemo {
public static void main(String[] args) {
// 创建一个对象
Person person = new Person("Alice", 25, "female");
// 序列化该对象并将其保存到文件中
try {
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in person.ser");
} catch (IOException i) {
i.printStackTrace();
}
// 反序列化文件中的对象
try {
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person deserializedPerson = (Person) in.readObject();
in.close();
fileIn.close();
System.out.println("Deserialized Person:");
System.out.println("Name: " + deserializedPerson.getName());
System.out.println("Age: " + deserializedPerson.getAge());
System.out.println("Gender: " + deserializedPerson.getGender());
} catch (IOException i) {
i.printStackTrace();
} catch (ClassNotFoundException c) {
System.out.println("Person class not found");
c.printStackTrace();
}
}
}
class Person implements java.io.Serializable {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
}
```
在上面的代码中,我们创建了一个名为 `Person` 的简单 Java 类,并将其实现了 `Serializable` 接口,以便可以对其进行序列化和反序列化。
在 `main` 方法中,我们首先创建一个 `Person` 对象,并将其序列化并写入到名为 `person.ser` 的文件中。
然后,我们使用 `ObjectInputStream` 类读取该文件,并将其转换为 `Person` 对象。最后,我们打印出反序列化后得到的对象的属性。
需要注意的是,序列化和反序列化期间使用的类必须实现 `Serializable` 接口,否则会抛出 `NotSerializableException` 异常。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)