javaIO流-Data流、序列化流

Data流

概念

data流:可以直接把数据类型也保存,读写在文件中,当对于一个数据读写需要保存数据类型的时候,可以使用data流

使用

/*
 Data流 | 基本数据类型流 : 读写数据+保留数据类型->基本数据类型|字符串
            是字节流的功能流
            DataInputStream     Data输入流
                新增功能 : readXxx()
            DataOuutputStream   Data输出流
                新增功能 : writeXxx()

       注意: 读入与写出的顺序保持一致
             读入数据的时候必须从源文件中读入,否则抛出异常 java.io.EOFException
*/
 //写出
    public static void wirte(String path) throws IOException {
        //1.构建输出流
        DataOutputStream os = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
        //2.准备数据
        int i = 100;
        char ch = 'a';
        boolean flag = false;
        String str = "哈哈";

        //3.写出
        os.writeInt(i);
        os.writeChar(ch);
        os.writeBoolean(flag);
        os.writeUTF(str);

        //4.刷出
        os.flush();

        //5.关闭
        os.close();
    }


    //读入
    public static void read(String path) throws IOException {
        //1.构建输入流
        DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(path)));

        //2.读入
        int i = is.readInt();
        char ch = is.readChar();
        boolean flag = is.readBoolean();
        String msg = is.readUTF();
        //3.处理数据
        System.out.println(i);
        System.out.println(ch);
        System.out.println(flag);
        System.out.println(msg);

        //4.关闭
        is.close();
    }

序列化流 Object

使用

/*
 Object流|对象流|引用数据类型流
        字节流的功能流
        ObjectInputStream   反序列化输入流
            新增方法  Object readObject() 从ObjectInputStream中读取一个对象。  等等
        ObjectOutputStream  序列化输出流
            新增方法 void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。

        序列化: 将对象数据转为可存储或者可传输的状态的过程
        不是所有类型的数据都能序列化 java.io.Serializable
            如果写出的对象类型没有实现序列化接口,会遇到运行时异常java.io.NotSerializableException
        序列化与反序列化顺序保持一致
        不是所有的属性都需要序列化 transient
        static的成员不会被序列化
        如果父类实现类序列化接口,子类所有内容都可以进行序列化
        子类实现了序列化接口,只能序列化子类独有的内容

        序列号: 当实现了序列化的类型默认存在一个序列号
        当类中的成员发生改变,序列号默认会重新生成
        作用: 使用序列号可以实现检查前后版本不一致问题

        解决不同版本的兼容问题: 手动设置序列号

        通过快捷键生成序列号:
            1.类型必须实现了序列化接口
            2.Setting中进行配置
            3.双击类名alt+enter,自动生成序列号【如果快捷键无效,请如下图设置】
*/

在这里插入图片描述

  public static void testRead(String path) throws IOException, ClassNotFoundException {
        //1.构建输入流
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(path));
        //2.读入数据
        Person p = (Person) is.readObject();
        int[] arr = (int[]) is.readObject();
        //3.处理数据
        System.out.println(p);
        System.out.println(Arrays.toString(arr));
        //4.关闭
        is.close();
    }

    //序列化输出
    public static void testWrite(String path) throws IOException {
        //1.定义输出流
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
        //2.准备数据
        Person p = new Person("张三",18);
        p.a = 10;
        int[] arr = {1,2,3,4,5};
        //3.写出
        os.writeObject(p);
        os.writeObject(arr);
        //4.刷出
        os.flush();
        //5.关闭
        os.close();
        p.a = 100;
    }
class Person implements Serializable {
	//设置序列化ID,序列化后,类中内容发生改变后,可以继续反序列化
    private static final long serialVersionUID = -1108656603703788489L;
    private String name;
    //transient 表示此字段不会被序列化
    private transient int age;
    //Static静态内容也不会被序列化
    public static int a ;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ",a="+a+
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值