java學習筆記(9)——IO系統 序列化與反序列化

把對象以流的方法,寫入到文件中保存:寫對象(對象的序列化)
對象中包含的不單單是字符,使用字節流java

ObjectOutputStream(對象序列化流)
ObjectInputStream(對像反序列化流)
image.png數組

ObjectOutputStream類

對象的序列化流
java.io.ObjectOutputStream extends OutputStream
把對象以流的形式寫入到文件中保存編碼

構造方法:spa

ObjectOutputStream(OutputStream out):建立寫入指定OutputStream的ObjectOutputStream
參數:
    OutputStream out:字節輸出流

特有成員方法:3d

void writeObject(Object obj):將指定的對象寫入ObjectOutputStream

使用步驟code

  1. 建立ObjectOutputStream對象,構造方法傳遞字節輸出流
  2. 使用ObjectOutputStream對象中writeObject方法,把對象寫入到文件中
  3. 釋放資源

序列化和反序列化時,會拋出NotSerializableException
要實現序列化和反序列化的類必須實現Serializable接口(僅起標記做用)對象

image.png

public class Person implements Serializable {
    private String name;
    private int age;
    ....
}
public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\A JI\\program\\java\\test-txt\\person.txt"));

        oos.writeObject(new Person("hehe", 18));
        oos.close();
    }

ObjectInputStream類

對象的反序列化流
java.io.ObjectInputStream extends InputStream
把文件中保存的對象,以流的方式讀取使用blog

構造方法:繼承

ObjectInputStream(InputStream In):建立寫入指定InputStream的ObjectInputStream
參數:
    InputStream in:字節輸入流

特有的成員方法:接口

Object readObject() 從ObjectInputStream 讀取對象

使用步驟

  1. 建立ObjectInputStream對象,構造方法傳遞字節輸入流
  2. 使用ObjectInputStream對象中readObject方法,讀取保存對象的文件
  3. 釋放資源
  4. 使用讀取的對象(打印)

readObject()聲明會拋出ClassNotFoundException(class文件找不到異常)

反序列化前提:

**1.類必須實現Serializable接口
2.必須存在類對應的class文件**

public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\A JI\\program\\java\\test-txt\\person.txt"));

        Object o = ois.readObject();

        ois.close();
        System.out.println(o);
        Person p = (Person)o;
        System.out.println(p.getName() + p.getAge());
    }

output:
Person{name='hehe', age=18}
hehe18

image.png

transient關鍵字
被transient修飾的成員變量,不能被序列化

image.png

解決方案:
開發者本身定義一個序列號

private static final long serialVersionUID = 1L;

案例

序列化集合

public static void main(String[] args) throws IOException, ClassNotFoundException {
        //定義存儲Person對象的數組
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("zz", 18));
        list.add(new Person("qq", 19));
        list.add(new Person("cc", 20));
        //存儲Person對象到ArrayList數組中
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\A JI\\program\\java\\test-txt\\person12.txt"));
        oos.writeObject(list);
        //讀取文件中保存的集合
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\A JI\\program\\java\\test-txt\\person12.txt"));
        Object o = ois.readObject();
        //將Object類型集合轉換爲ArrayList集合
        ArrayList<Person> list2 = (ArrayList<Person>) o;

        for (Person person : list2) {
            System.out.println(person.getName() + " " + person.getAge());
        }
    }
    
    
output:
zz 18
qq 19
cc 20

打印流

java.io.PrintStream extends OutputStream

特色:

  1. 只負責數據輸出,不負責數據的讀取
  2. 永遠不會拋出IOException
  3. 特有方法:print,println

構造方法:

PrintStream(File file):輸出目的地是一個文件
PrintStream(OutputStream out):...是一個字節輸出流
PrintStream(String fileName):...是一個文件路徑

若是使用繼承自父類的write方法寫數據,查數據會查詢編碼表
若是使用自身特有的print/println方法寫數據,寫得數據原樣輸出

image.png
image.png

相關文章
相關標籤/搜索