java学习笔记(序列化初步+数据流+处理流的个人理解)

序列化的本质其实就是。

将某样东西封装为对象之后,利用序列化转化为二进制文件,再利用字节输出流储存在硬盘中。而反序列化则是把二进制文件在嵌套了输入流的序列化处理下,重新变回原来的样子

java学习笔记(序列化初步+数据流+处理流的个人理解)

 这个图片代表我对序列化的理解,同时也是我对于大多数处理流和嵌套的理解

序列化的代码如下

package com.Ioliu;

import java.io.*;

public class Text_obStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectOutputStream os1=new ObjectOutputStream(new FileOutputStream("D:\\duo.txt"));
        os1.writeObject("asd");
        //此刻变为二进制文件,存在于硬盘之中
        ObjectInputStream os2=new ObjectInputStream(new FileInputStream("D:\\duo.txt"));
        System.out.println(os2.readObject());
        //再用对象流进行读取,最终得到的还是这个封装成对象的东西;
        os2.close();
        os1.close();
    }
}

这里有一点需要注意的是,上面进行序列化的时候,序列化的是一个字符串 字符串这个类本身已经实现了Serializable接口,所以可以正常使用 如果自定义的类没有实现这个接口,序列化时就会出现这种报错 只要实现了就没事情了,详见下方

java学习笔记(序列化初步+数据流+处理流的个人理解)

 

package com.Ioliu;

import java.io.*;

public class Io_Stream  {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectOutputStream a1=new ObjectOutputStream(new FileOutputStream("D:\\dio.txt"));
        //ut是一个类
        ut ass=new ut(14122);
        //如果不插入Serializable接口的话,下面这个写入都会出问题;
        a1.writeObject(ass);
        a1.close();
        ObjectInputStream a2=new ObjectInputStream(new FileInputStream("D:\\dio.txt"));
        ut as=(ut)a2.readObject();
        System.out.println(as.name);
        a2.close();
    }
}
class ut implements Serializable{
    int name;
    public ut(int name) {
        this.name = name;
    }
}

关于数据流

数据流的作用是将基本数据类型和字符串转化为乱码,或者将对应的乱码{有序}地转化为数据类型和字符串。也同样是一种处理流

基本原理也可以用上面序列化和反序列化的图片来理解

import java.io.*;

public class Text_data {
    public static void main(String[] args) throws IOException {
        //数据输入输出流本质上还是处理流,嵌套的是字节流,用来处理基本数据类型和字符串
        //这里接受的直接就是字节流

        //DataInputStream di=new DataInputStream(new FileInputStream(""));
        //输出流的嵌套在下面
        /*File a=new File("D:\\duo.txt");
        FileOutputStream ot=new FileOutputStream(a);*/
        //合在一起写也没什么太大问题啦
        DataOutputStream dt=new DataOutputStream(new FileOutputStream("D:\\duo.txt",true));
        //若想不覆盖,再文件对象并列的地方明确指出true/false
        //这里就没写输入流,直接连接好文件输出流,再嵌套上一个数据输出流
        dt.writeUTF("22222");
        dt.close();
        //di.close();
    }
}

package com.Ioliu;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
//上一个程序已经利用文件数据输入流
//但是文件里的东西人类是看不懂的
//只能用数据输入流进行逆向识别
public class text_data2 {
    public static void main(String[] args) throws IOException {
        //之前那段代码已经把数据全都塞入dou文件里了,这里重新连接上一个数据输入流
        DataInputStream da=new DataInputStream(new FileInputStream("D:\\duo.txt"));
        //再进行文件内容读取
        //读取到的东西用变量储存在程序内存中
        String sc=da.readUTF();
        String sd=da.readUTF();
        da.close();
        //接下来直接输出变量即可
        System.out.println(sc);
        System.out.println(sd);
    }
}

//管道要链接到什么位置一定要明确(有一端是默认连接到程序)
//输入时按什么顺序输入的,输出的时候就要安神莫顺序输出
//读取的时候好像自带分隔,也是和输入的时候一样是匹配的次数
//算是紧密结构吗?????

上一篇:【VS2022+ASP.Net Core+.net6】NLog 配置和使用


下一篇:JWT消息构成