序列化就是将一个对象以及他的属性写入一个文件,保存在存中对象的状态
反序列化就是把保存的对象状态再读出来
实现序列化与反序列化就要使用到IO操作中文件的字节流输入与输出
inputStream与outputStream对字节流操作inputStreamReader与outputStreamWrite为字符流操作
input与output是对于java内存而言的 input输入是由外部----->内存 output输出是内存---->外部
任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象,我们可以用read()方法将其取出
任何有能力接收数据源(流)的javaio对象我们就可以看作是一个OutputStream对象,可以用write()方法接受
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的,Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
序列化分三步
1.创建FileOutputStream 对象,file是一个File类的对象
File file = new File("D:\\person.per");括号内表示生成文件的存储路径
FileOutputStream fout = new FileOutputStream(file);
2.创建ObjectOutputStream 对象
ObjectOutputStream oos = null;
oos = new ObjectOutputStream(fout);
3.将对象写入
p是一个实例化的对象Person p = new Person("aaa",12);
oos.writeObject(p);
最后就得关闭输出流,节省资源
oos.close();
fout.close();
反序列化也分三步,与序列化对应
1.
1.新建FileInputStream 对象,读取文件
FileInputStream fin = new FileInputStream(file);
2.新建ObjectInputStream 对象
ObjectInputStream oin;
oin = new ObjectInputStream(fin);
3.读取文件并恢复为对象
Person per1 = (Person) oin.readObject();
fin.close();
oin.close();
public class Javaxuliehua {
public static void main(String[] args) {
//File file = new File("D:"+File.separator+"person.per");
File file = new File("D:\\person.per");
/**
* 序列化过程
*/
Person p = new Person("aaa",12);
try {
FileOutputStream fout = new FileOutputStream(file);
ObjectOutputStream oos = null;
oos = new ObjectOutputStream(fout);
oos.writeObject(p);
oos.close();
fout.close();
/**
* 反序列化过程
*/
FileInputStream fin = new FileInputStream(file);
ObjectInputStream oin;
oin = new ObjectInputStream(fin);
Person per1 = (Person) oin.readObject();
System.out.println(per1);
fin.close();
oin.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}
class Person implements Serializable{
private String name;
private int age;
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 + "]";
}
}