序列化和反序列化

 

对象的序列化流

java.io.ObjectOutputStream extends OutputStream

作用:把对象以流的方式写入到文件中

 

构造方法:

ObjectOutputStream(OutputStream out)创建写入指定OutputStream的ObjectOutputStream

参数:

  OutputStream out:字节输出流

 

特有的成员方法:

void writeObject(Object obj):将指定的对象写入ObjectOutputStream

 

使用步骤:

1.创建ObjectOutputStream对象,构造方法中传递字节输出流

2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中

3.释放资源

 

Person类:

public class Person implements Serializable {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", 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;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}

 

序列化和反序列化的时候偶,会抛出NotSerializableException没有序列化异常

类通过实现java.io.Serializable接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

 

Serializable接口也叫标记型接口

  要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记

  当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记

    有就可以序列化和反序列化

    没有就会抛出NotSerializableException异常

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo01ObjectOutputStream {
    public static void main(String[] args) throws IOException {
        //创建ObjectOutputStream对象,构造方法中传递字节输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\Java\\Practice\\src\\Practice\\demo15\\day43\\person.txt"));
        //使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
        oos.writeObject(new Person("迪丽热巴",18));
        //释放资源
        oos.close();
    }
}

 

对象的反序列化流

java.io.ObjectInputStream extends InputStream

作用:把文件中保存的对象以流的方式读取出来使用

 

构造方法:

ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream

 

特有的成员方法:

Object readObject():从ObjectInputStream读取对象

 

使用步骤:

1.创建ObjectInputStream对象,构造方法中传递字节输入流

2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件

3.释放资源

4.使用读取出来的对象

 

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Demo02ObjectInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建ObjectInputStream对象,构造方法中传递字节输入流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\Java\\Practice\\src\\Practice\\demo15\\day43\\person.txt"));
        //使用ObjectInputStream对象中的方法readObject读取保存对象的文件
        Object o = ois.readObject();
        //释放资源
        ois.close();
        //使用读取出来的对象
        System.out.println(o);
        Person p = (Person) o;
        System.out.println(p.getName()+"="+p.getAge());
    }
}

 

tramsient关键字

static关键字:静态关键字

  静态优先于非静态加载到内存中(静态优先于对象进入到内存中)

  被static修饰的成员变量不能被序列化,序列化的都是对象

transient关键字:瞬态关键字

  被transient修饰的成员变量,不能被序列化

 

序列化集合

当我们想在文件中保存多个对象的时候,可以把多个对象存储至一个集合当中进行序列化和反序列化。

import java.io.*;
import java.util.ArrayList;

public class Demo03Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("迪丽热巴",18));
        list.add(new Person("古力娜扎",19));
        list.add(new Person("马尔扎哈",20));
        list.add(new Person("撒扬娜拉",21));

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\Java\\Practice\\src\\Practice\\demo15\\day43\\personArray.txt"));
        oos.writeObject(list);

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\Java\\Practice\\src\\Practice\\demo15\\day43\\personArray.txt"));
        Object o = ois.readObject();
        ArrayList<Person> list2 = (ArrayList<Person>) o;
        for (Person p : list2) {
            System.out.println(p);
        }

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


    }
}

 

打印流

java.io.PrintStream extends OutputStream

PrintStream:为其他输出流添加了功能,使它们能够方便的打印各种数据值表示形式

 

PrintStream特点:

1.只负责数据的输出,不负责数据的读取

2.与其它输出流不同,PrintStream永远不会抛出IOException

3.特有的方法:print/println

 

构造方法:

- PrintStream(File file)

- PrintStream(OutputStream out)

- PrintStream(String fileName)

 

继承自父类的成员方法:

- public void close():关闭此输出流并释放与此流相关联的任何系统资源

- public void flush():刷新此输出流并强制任何缓冲的输出字节被写入

- public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流

- public void write(byte[] b, int off, int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流

- public abstract void write(int b):将指定的字节输出流

 

public class Demo04PrintStream {
    public static void main(String[] args) throws FileNotFoundException {
        PrintStream ps = new PrintStream("E:\\Java\\Practice\\src\\Practice\\demo15\\day43\\print.txt");
        ps.write(97);
        ps.println(97);
        ps.println(8.8);
        ps.println('a');
        ps.println("Hello World");

        ps.close();

    }
}

java 输出 对象 java输出对象到日志_java

 

 

 

可以改变输出语句的目的地(打印流的流向)

输出语句,默认在控制台输出

使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地

static void setOut(PrintStream out) 重新分配标准输出流

public class Demo05PrintStream {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("我是在控制台输出");

        PrintStream ps = new PrintStream("E:\\Java\\Practice\\src\\Practice\\demo15\\day43\\PrintStream.txt");
        System.setOut(ps);

        System.out.println("我在打印流的目的地中输出");
        
        ps.close();
    }
}

java 输出 对象 java输出对象到日志_java 输出 对象_02

 

 

java 输出 对象 java输出对象到日志_序列化_03

 

 

 

 

今天基本上就把Java基础学习完了,明天开始做练习吧!