序列化的本质其实就是。
将某样东西封装为对象之后,利用序列化转化为二进制文件,再利用字节输出流储存在硬盘中。而反序列化则是把二进制文件在嵌套了输入流的序列化处理下,重新变回原来的样子
这个图片代表我对序列化的理解,同时也是我对于大多数处理流和嵌套的理解
序列化的代码如下
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接口,所以可以正常使用 如果自定义的类没有实现这个接口,序列化时就会出现这种报错 只要实现了就没事情了,详见下方
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);
}
}
//管道要链接到什么位置一定要明确(有一端是默认连接到程序)
//输入时按什么顺序输入的,输出的时候就要安神莫顺序输出
//读取的时候好像自带分隔,也是和输入的时候一样是匹配的次数
//算是紧密结构吗?????