一、实验目的
本实验的目的是掌握File类的使用,完成对象序列化与反序列化。
二、实验内容
给定一个Student类,
public class Student {
private int number;
private String name;
}
完成这个类的设计,实现数据成员的Get和Set函数编写以及toString()函数编写,编写程序多个Student对象存储在数组时以及多个Student对象存储在ArrayList数组时,使用文件实现Student对象数组和ArrayList数组的读和写操作。
三、实验步骤
- 创建集合对象s(全局变量)
- 创建一个ObjectOutputStream对象输出流obs
- 创建学生对象student1,student2,student3
- 添加对象到集合s
- 利用toString() 把集合转成数组objs[]
- 利用tostring()函数将集合中的对象转为数组,对象的个数即为数组的长度,写一个for循环,将数组元素依次强制转换为Student对象并写入文件中。
- 创建一个ObjectInputStream对象输入流ois
- 利用全局变量集合s的大小,写一个for循环,从ObjectInputStream对象输入流中依次读取对象,并强制转换成Student对象,并依次输出各对象信息。
四、实验结果
五、实验小结
这次实验的难点在于如何写两个循环,一个能够将对象依次写入文件中,另一个能够从文件中依次读取文件内容。第一个循环:利用tostring()函数将集合中的对象转为数组,对象的个数即为数组的长度,写一个for循环,将数组元素依次强制转换为Student对象并写入文件中。第二个循环:利用全局变量集合s的大小写一个for循环 ,从ObjectInputStream对象输入流中依次读取对象,并强制转换成Student对象,并依次输出各对象信息。
这次实验还有一个需要注意的点:在写文件地址的时候,一定要仔细!差了一个空格都会导致整个文件无法读取!
"/Users/zhuxiaoyue/Desktop/student.txt "
❌这样是不行的,student.txt后不能有一个空格!
以下为正确格式:
"/Users/zhuxiaoyue/Desktop/student.txt"
六.附录
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
public class ObjectOutputStreamDemo {
public static void main(String[] args) {
//创建集合对象
Collection s= new ArrayList();
// 创建一个ObjectOutputStream对象输出流
try (ObjectOutputStream obs = new ObjectOutputStream(new
FileOutputStream("/Users/zhuxiaoyue/Desktop/student.txt"))) {
//创建学生对象
Student student1= new Student(25, "Bob");
Student student2= new Student(06, "Tom");
Student student3= new Student(17, "Steven");
//添加对象到集合
s.add(student1);
s.add(student2);
s.add(student3);
//把集合转成数组
Object[] objs = s.toArray();
// 把对象写入到文件中
for(int x=0;x<objs.length;x++) {
Student s1 =(Student)objs[x];
obs.writeObject(s1);
}
obs.flush();
System.out.println("序列化完毕!");
} catch (Exception ex) {
ex.printStackTrace();
}
// 创建一个ObjectInputStream对象输入流
try (ObjectInputStream ois = new ObjectInputStream(new
FileInputStream("/Users/zhuxiaoyue/Desktop/student.txt"))) {
System.out.println("序列化完毕!读出的对象信息如下:");
// 从ObjectInputStream对象输入流中读取对象,并强制转换成Student对象
for(int i=0;i<s.size();i++)
{
Student s2 =(Student)ois.readObject();
System.out.println(s2);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Student.java
import java.io.Serializable;
public class Student implements Serializable{
private int number;
private String name;
public Student(int number, String name) {
super();
this.number = number;
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + "]";
}
}
网友评论