笔试可能会考:
以前存储数据的方式是 变量 数组 集合 对象—->临时性的 在内存中 用完就回收了
有了文件后 可以将数据存储在文件中—->数据永久保存 数据的持久化
如果我们想记录对象的方法 我们就可以把对象存到文件里
对象的序列化与反序列化
序列化**将一个完整的对象拆分成碎片 反序列化**将文件中记录的对象碎片 反过来组合成一个完整的对象
对象的持久化 内存对象永久保存在文件中
如果按照一行为单位写信息
好处 每一行记录的信息是相关的 我们可以直接看懂文件
不好处 不安全 我们都能直接看懂
只能记录String信息 不能记录一些动作(方法)
可以将对象拆分成字节码 直接写入文件 String ——> Person
对象流 ObjectInputStream ObjectOutputStream
对象流也是高级流 创建对象时 要使用相对应的低级流
ObjectInputStream—->FileInputStream ObjectOutputStream—->FileOutputStream
对象的序列化/反序列化
序列化
将一个完整的对象 拆分成字节碎片 记录在文件中
反序列化
将文件中记录的对象碎片 反过来组合成一个完整的对象
要想将对象序列化到文件中
需要实现Serializable接口 这个接口是一个示意性接口 这个接口没写任何东西
同时为了让对象可以反序列化 需要让对象中多存在一个属性
private static long serialVersionUID = 值L;值可以随便取
只有版本相同才能读取到里面的信息
要想将对象反序列化
需要给对象提供一个序列化的版本号 比如 1.7版本写进去—->String 1.8版本读—->String 版本不同会导致结果不同
public class Person implements Serializable {
//实现Serializable接口 序列化
private static long serialVersionUID = 4568795L;//为了能够反序列化
private String name;
private int age;
public Person(){}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public void eat(){
System.out.println("人类的吃饭方法");
}
}
对象序列化:
public static void main(String[] args){
try {
Person p1 = new Person("小兰",18);
FileOutputStream fw = new FileOutputStream("E://test//Person.txt");
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(fw);
oos.writeObject(p1);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
反序列化:
public static void main(String[] args){
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E://test//Person.txt"));
//对象反序列化
Person p = (Person)ois.readObject();
System.out.println(p.getName()+"---"+p.getAge());
p.eat();
//当读取多个对象时 读取完毕后会抛出异常 EOFException 读到这个异常说明没有对象了
//通常我们会将对象都一起放在一个集合中 这样就不用一个一个对象的读
} catch (Exception e) {
e.printStackTrace();
}
}
多个对象:
public static void main(String[] args){
try {
Person p1 = new Person("小兰",18);
Person p2 = new Person("小明",17);
Person p3 = new Person("小黑",16);
FileOutputStream fw = new FileOutputStream("E://test//Person.txt");
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(fw);
oos.writeObject(p1);
oos.writeObject(p2);
oos.writeObject(p3);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E://test//Person.txt"));
//对象反序列化
Person p = (Person)ois.readObject();
while(p!=null){
System.out.println(p.getName()+"---"+p.getAge());
p.eat();
p = (Person)ois.readObject();
}
//当读取多个对象时 读取完毕后会抛出异常 EOFException 读到这个异常说明没有对象了
//通常我们会将对象都一起放在一个集合中 这样就不用循环一个一个对象的读
} catch (Exception e) {
e.printStackTrace();
}
}