笔试可能会考:
以前存储数据的方式是 变量 数组 集合 对象—->临时性的 在内存中 用完就回收了
有了文件后 可以将数据存储在文件中—->数据永久保存 数据的持久化
如果我们想记录对象的方法 我们就可以把对象存到文件里
对象的序列化与反序列化
序列化**将一个完整的对象拆分成碎片 反序列化**将文件中记录的对象碎片 反过来组合成一个完整的对象
对象的持久化 内存对象永久保存在文件中
如果按照一行为单位写信息
好处 每一行记录的信息是相关的 我们可以直接看懂文件
不好处 不安全 我们都能直接看懂
只能记录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();}}
