笔试可能会考:
以前存储数据的方式是 变量 数组 集合 对象—->临时性的 在内存中 用完就回收了
有了文件后 可以将数据存储在文件中—->数据永久保存 数据的持久化
如果我们想记录对象的方法 我们就可以把对象存到文件里

对象的序列化与反序列化
序列化**将一个完整的对象拆分成碎片 反序列化**将文件中记录的对象碎片 反过来组合成一个完整的对象
对象的持久化 内存对象永久保存在文件中

如果按照一行为单位写信息
好处 每一行记录的信息是相关的 我们可以直接看懂文件
不好处 不安全 我们都能直接看懂
只能记录String信息 不能记录一些动作(方法)
可以将对象拆分成字节码 直接写入文件 String ——> Person

对象流 ObjectInputStream ObjectOutputStream
对象流也是高级流 创建对象时 要使用相对应的低级流
ObjectInputStream—->FileInputStream ObjectOutputStream—->FileOutputStream

对象的序列化/反序列化

序列化
将一个完整的对象 拆分成字节碎片 记录在文件中
反序列化
将文件中记录的对象碎片 反过来组合成一个完整的对象
要想将对象序列化到文件中
需要实现Serializable接口 这个接口是一个示意性接口 这个接口没写任何东西
同时为了让对象可以反序列化 需要让对象中多存在一个属性
private static long serialVersionUID = 值L;值可以随便取
只有版本相同才能读取到里面的信息
要想将对象反序列化
需要给对象提供一个序列化的版本号 比如 1.7版本写进去—->String 1.8版本读—->String 版本不同会导致结果不同

  1. public class Person implements Serializable {
  2. //实现Serializable接口 序列化
  3. private static long serialVersionUID = 4568795L;//为了能够反序列化
  4. private String name;
  5. private int age;
  6. public Person(){}
  7. public Person(String name,int age){
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName(){
  12. return this.name;
  13. }
  14. public int getAge(){
  15. return this.age;
  16. }
  17. public void eat(){
  18. System.out.println("人类的吃饭方法");
  19. }
  20. }

对象序列化:

  1. public static void main(String[] args){
  2. try {
  3. Person p1 = new Person("小兰",18);
  4. FileOutputStream fw = new FileOutputStream("E://test//Person.txt");
  5. //对象序列化
  6. ObjectOutputStream oos = new ObjectOutputStream(fw);
  7. oos.writeObject(p1);
  8. oos.flush();
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. }

反序列化:

  1. public static void main(String[] args){
  2. try {
  3. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E://test//Person.txt"));
  4. //对象反序列化
  5. Person p = (Person)ois.readObject();
  6. System.out.println(p.getName()+"---"+p.getAge());
  7. p.eat();
  8. //当读取多个对象时 读取完毕后会抛出异常 EOFException 读到这个异常说明没有对象了
  9. //通常我们会将对象都一起放在一个集合中 这样就不用一个一个对象的读
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }

多个对象:

  1. public static void main(String[] args){
  2. try {
  3. Person p1 = new Person("小兰",18);
  4. Person p2 = new Person("小明",17);
  5. Person p3 = new Person("小黑",16);
  6. FileOutputStream fw = new FileOutputStream("E://test//Person.txt");
  7. //对象序列化
  8. ObjectOutputStream oos = new ObjectOutputStream(fw);
  9. oos.writeObject(p1);
  10. oos.writeObject(p2);
  11. oos.writeObject(p3);
  12. oos.flush();
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. try {
  17. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E://test//Person.txt"));
  18. //对象反序列化
  19. Person p = (Person)ois.readObject();
  20. while(p!=null){
  21. System.out.println(p.getName()+"---"+p.getAge());
  22. p.eat();
  23. p = (Person)ois.readObject();
  24. }
  25. //当读取多个对象时 读取完毕后会抛出异常 EOFException 读到这个异常说明没有对象了
  26. //通常我们会将对象都一起放在一个集合中 这样就不用循环一个一个对象的读
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }