Java 文件IO ObjectInputStream,ObjectOutputStream

问题

如何将程序中的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方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值