问题
如何将程序中的int a=100保存到文件中去呢,如何将程序中的Class类保存到文件中去?
如何从文件中将int a=100 恢复到程序中去呢,如何将文件中的Class类恢复到程序中去?
这个时候就需要java io 中的ObjectInputStream和ObjectOutputStream这两个对象文件io类了。
序列化和反序列化
ObjectInputStream的继承关系如下
ObjectOutputStream 的继承关系如下
ObjectOutputStream
使用ObjectOutputStream输出数据到object.data文件中。
import java.io.*;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws IOException {
// 创建对象输出流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.data"));
// 输出一个整数到文件
// 这里会把100 int类型的数据转换成Integer数据类型,因为Integer实现了Serializable 接口.
objectOutputStream.writeInt(100);
// 输出一个字符串到文件
// "今天是个好日子" String类型的数据转换成String数据类型,因为String实现了Serializable 接口.
objectOutputStream.writeUTF("今天是个好日子");
// 输出一个整形到文件
// 同样Double也实现了Serializable接口
objectOutputStream.writeDouble(3.1415926);
// 输出一个类到文件
objectOutputStream.writeObject(new Dog("Ditandier",32));
// 关闭
objectOutputStream.close();
//
System.out.println("保存成功");
}
}
//一个类 如果想要写入文件就必须使用Serializable接口
class Dog implements Serializable{
private String name;
private int age;
Dog(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
ObjectInputStream
使用ObjectInputStream从object.data文件中读取数据到程序中。
import java.io.*;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws IOException ,ClassNotFoundException{
// 创建objectInputStream读取数据到程序
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("object.data"));
// 读取int
System.out.println(objectInputStream.readInt());
// 读取字符串
System.out.println(objectInputStream.readUTF());
// 读取double
System.out.println(objectInputStream.readDouble());
// 读取类
Dog dog = (Dog)objectInputStream.readObject();
// 输出查看
System.out.println(dog.getName());
System.out.println(dog.getAge());
// 关闭流
objectInputStream.close();
}
}
//一个类 如果想要写入文件就必须使用Serializable接口
class Dog implements Serializable{
private String name;
private int age;
Dog(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
常见错误和注意事项
类型不匹配错误
当我在dog类中添加一个tostring方法的时候,再次运行程序会程序如下错误
在dog类添加如下方法
运行程序出现如下错误
Exception in thread "main" java.io.InvalidClassException: Dog; local class incompatible: stream classdesc serialVersionUID = 889173899007065912, local class serialVersionUID = 8890344951678660442
at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:560)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2020)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1870)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2201)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1687)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:489)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:447)
at Main.main(Main.java:15)
这是因为我们在写入dog类到文件的时候是没有tostring方法的,当我们修改了程序之后再次读取文件中的dog的时候就会发现没有tostring方法,所以导致数据类型不匹配,出现了如上异常。
解决方法
1.再把dog类重新写入文件读取就可以了。
2. 删除tostring方法。