数据和对象文件输入输出流

DataInputStream类与DataOutputStream类
这两个类分别是数据字节输入流与数据字节输出流
什么是数据文件呢?
将内存中的"int i=10;"写入到硬盘文件中,写进去的不是字符串,写进去的是二进制类型数据,带类型

public static void main(String[] args) throws Exception {
        //创建数据字节输出流,它的构造方法也需要传入一个字节输出流
        DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:\\idea\\java code\\src\\learn\\IO\\temp04"));
        //准备数据
        byte b=10;
        short s=11;
        int i=13;
        long l=1000L;
        float f=3.14f;
        double d=2.3;
        boolean flag=true;
        char c='c';
        //写
        dos.writeByte(b);
        dos.writeShort(s);
        dos.writeInt(i);
        dos.writeLong(l);
        dos.writeFloat(f);
        dos.writeDouble(d);
        dos.writeBoolean(flag);
        dos.writeChar(c);
        //刷新
        dos.flush();
        //关闭
        dos.close();
    }

文件中存储了数据文件,在读取的时候我们需要注意:读取数据文件时,需要知道数据文件的存储类型格式和存储顺序。

public static void main(String[] args)throws Exception {
        //创建数据文件输入流
        DataInputStream dis=new DataInputStream(new FileInputStream("D:\\idea\\java code\\src\\learn\\IO\\temp04"));
        //读取数据(要使用该流读取数据,必须提前知道该文件中存储格式,存储顺序)
        System.out.println(dis.readByte());//10
        System.out.println(dis.readShort());//11
        System.out.println(dis.readInt());//13
        System.out.println(dis.readLong());//1000
        System.out.println(dis.readFloat());//3.14
        System.out.println(dis.readDouble());//2.3
        System.out.println(dis.readBoolean());//true
        System.out.println(dis.readChar());//c
        //关闭
        dis.close();
    }
//针对于该数据文件中有不同的数据类型,必须按照存储的数据类型顺序来读取,才可以读取成功

我们想要存储java对象到硬盘时,就需要使用对象字节输入输出流
ObjectInputStream类与ObjectOutputStream类
当我们存储一个java对象时,需要该对象实Serializable接口,这个接口中没有需要实现的方法,属于一个标志接口。系统会根据属性为该类添加一个序列化版本号。
这边就可能会出现一个问题:
当我们存储一个实现序列化的java对象时,会有一个序列化版本号。
当我们读取该序列化对象的时候,可能该类的属性会发生了改变,那么反序列化版本号就会与序列化版本号不相匹配,那么就会出现异常。所以我们会为该类定义一个序列化版本号让它不要改变。

import java.io.Serializable;
//因为User实现了Serializable接口,JVM会特殊待遇,会给该类添加一个属性。
//static final long serialVersionUID 类的序列化版本号
public class User implements Serializable {
    //不让系统自动生成,自己写一个序列化版本号
    private static final long serialVersionUID = -9208351117053185643L;
    //如果不想让某个属性参加序列化,就需要使用transient关键字修饰
    transient String name;
    int age;
        User(String name){
            this.name=name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    '}';
        }
}

存储该对象

/*
    java.io.ObjectOutputStream;序列化Java对象到硬盘{Serial}
    java.io.ObjectInputStream;反序列化 将硬盘中的数据“反序列化”到JVM内存{DeSerial}

    Compile 编译 {java---class}
    DeCompile 反编译 {class---java}
 */
public class ObjectOutputStreamTest01 {
    public static void main(String[] args) throws Exception {
        //创建java对象
        User u1=new User("Plko");
        //创建输出流(序列化流)(JVM中的java对象状态保存到硬盘中)
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\idea\\java code\\src\\learn\\IO\\temp05"));
        //写
        oos.writeObject(u1);
        //刷新
        oos.flush();
        //关闭
        oos.close();
    }
}
//java.io.InvalidClassException: learn.IO.User; local class incompatible: stream classdesc serialVersionUID = -9208351117053185643, local class serialVersionUID = -920835111705318563
//此异常就是因为版本号不一致会出现。

读取该对象

/*
    反序列化
 */
public class ObjectInputStreamTest01 {
    public static void main(String[] args) throws Exception {
        //创建反序列化流
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\idea\\java code\\src\\learn\\IO\\temp05"));
        //反序列化
        Object o=ois.readObject();//该类的方法,用来读取java对象
        User u1=(User) o;
        System.out.println(u1.toString());//User{name=plko}
        //关闭
        ois.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值