Java语言ObjectOutputStream和ObjectInputStream的使用方法

Java语言ObjectOutputStream和ObjectInputStream的使用方法


常用方法

ObjectOutputStream

//创建对象写入流(写入到文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat")); //data.dat是文件名,可以带路径
//将对象写入文件
oos.writeObject(对象名);

注意:上面所示的方法,如果写入多个对象会覆盖,而不是追加。如果想要一次性写入多个方法,有两种做法:

  • 1、把对象存到集合里,然后用oos.writeObject()将这个集合写入到文件中
  • 2、在new ObjectOutputStream(new FileOutputStream("data.dat"))里面的new FileOutputStream("data.dat")可以写上第二个参数为true,即new FileOutputStream("data.dat",true)让这个流可以追加写入

ObjectInputStream

//创建对象读取流(从文件读取)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"));//data.dat是文件名,可以带路径

//从文件读取Object,强转为泛型WaterResource的List
List<WaterResource> list2 = (List<WaterResource>) ois.readObject();

注意:使用ois.readObject()时要进行类型强转

例题:

创建可串行化的WaterResource类,有两个属性:国家名、人均水资源量。自定义文件data.dat,同时在Java程序中创建5个WaterResource类的实例,使用ObjectOutputStream类将这5个实例写入到data.dat文件中,再使用ObjectInputStream类将其读入并输出显示。

解释

可串行化详见博客:Java串行化(序列化)解释、 Idea2020.1设置自动生成serialVersionUID

代码

package com.ylw.question7;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Question7 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        //创建5个实例对象
        WaterResource wr1 = new WaterResource("中国",100000);
        WaterResource wr2 = new WaterResource("美国",10000);
        WaterResource wr3 = new WaterResource("俄罗斯",1000);
        WaterResource wr4 = new WaterResource("法国",100);
        WaterResource wr5 = new WaterResource("英国",10);
        //把这5个实例对象放到list里
        List<WaterResource> list = new ArrayList<WaterResource>();
        list.add(wr1);
        list.add(wr2);
        list.add(wr3);
        list.add(wr4);
        list.add(wr5);

        //创建对象写入流(写入到文件)
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat"));
        //写入文件
        oos.writeObject(list);
        //关闭写入流
        oos.flush();oos.close();

        //创建对象读取流(从文件读取)
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"));
        //从文件读取Object,强转为泛型WaterResource的List
        List<WaterResource> list2 = (List<WaterResource>) ois.readObject();
        //遍历list2输出里面存的WaterResource实例对象
        for(WaterResource wr : list2){
            System.out.println(wr);
        }
        //关闭读取流
        ois.close();

    }

}

class WaterResource implements Serializable{
    private String countryName; //国家名
    private double perCapWaterResources; //人均水资源量

    public WaterResource() {
    }

    public WaterResource(String countryName, double perCapWaterResources) {
        this.countryName = countryName;
        this.perCapWaterResources = perCapWaterResources;
    }

    @Override
    public String toString() {
        return "WaterResource{" +
                "countryName='" + countryName + '\'' +
                ", perCapWaterResources=" + perCapWaterResources +
                '}';
    }
}

运行结果

在这里插入图片描述

data.dat文件

在这里插入图片描述

乱码原因:
ObjectOutputStream.writeObject()的作用是把一个实例的对象以文件的形式保存到磁盘上,
这个过程就叫Java对象的持久化。而这个文件是以二进制的形式编写的,当你用文本编辑器将它打开,这些二进制代码与某个字符集映射之后,显示出来的东西就成了乱码。(即使输出的是一个String的对象,也是以该String对象的二进制编码的形式输出,而不是输出String对象的内容。)我们需要通过ObjectInputStream来进行读取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影龙武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值