1.1 序列化流概述

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化对象的数据对象的类型对象中存储的数据信息,都可以用来在内存中创建对象。看图理解序

 1.2 ObjectOutputStream类

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

构造方法

  • public ObjectOutputStream(OutputStream out): 创建一个指定OutputStream的ObjectOutputStream。

FileOutputStream fos= new FileOutputStream("oos.txt");
ObjectOutputStream oos= new ObjectOutputStream(fos);

序列化操作

  1. 一个对象要想序列化,必须满足两个条件:

  • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException

  • 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

//要进行序列化和反序列话的接口必须要实现Serializable接口,给类添加一个标记,是否允许序列化和反序列还
//没有添加则会报错java.io.NotSerializable
public class User implements Serializable{

    private String name;
    private int age;

//......
    }
}

 

 1.3 ObjectInputStream类

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

构造方法

  • public ObjectInputStream(InputStream in): 创建一个指定InputStream的ObjectInputStream。

反序列化操作

如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream读取对象的方法:

  • public final Object readObject () : 读取一个对象。

public class Demo02ObjectiInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
        Object o = ois.readObject();
        System.out.println(o);

    }
}

 2.序列和和反序列化一个集合

public class Demo03ObjectList {
    public static void main(String[] args) throws Exception {

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
        LinkedList<User> list = new LinkedList<>();
        list.addLast( new User("hdh",20));
        list.addLast( new User("xj",20));
        list.addLast( new User("lq",20));
        oos.writeObject(list);

        LinkedList<User> lists = (LinkedList<User>)ois.readObject();
        lists.forEach(list1->System.out.println(list1));

        oos.close();
        ois.close();
    }
}

 

 

3.1 打印流概述

平时我们在控制台打印输出,是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

3.2 PrintStream类

构造方法

  • public PrintStream(String fileName): 使用指定的文件名创建一个新的打印流。

构造举例,代码如下:

PrintStream ps = new PrintStream("ps.txt")

改变打印流向

System.out就是PrintStream类型的,只不过它的流向是系统规定的,打印在控制台上。不过,既然是流对象,我们就可以玩一个"小把戏",改变它的流向。
public class PrintDemo {
    public static void main(String[] args) throws IOException {
        // 调用系统的打印流,控制台直接输出97
        System.out.println(97);
      
        // 创建打印流,指定文件的名称
        PrintStream ps = new PrintStream("ps.txt");
        
        // 设置系统的打印流流向,输出到ps.txt
        System.setOut(ps);
        // 调用系统的打印流,ps.txt中输出97
        System.out.println(97);
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-11-03 13:37  忆夏KhaZix  阅读(174)  评论(0编辑  收藏  举报