Java IO流->處理流->對象流:ObjectOutputStream&ObjectInputStream

圖一:

圖二:

圖三:

圖四:


示例代碼:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.junit.Test;

public class TestObjectInputOutputStream {
	/*
	 * 對象的序列化過程:將內存中的對象通過ObjectOutputStream轉換成二進制流,存儲在硬盤文件中
	 */
	@Test
	public void test1() {
		TestObject t1 = new TestObject("小花",23,new TestSubObject("小明"));
		TestObject t2 = new TestObject("小呆",22,new TestSubObject("大呆"));
		
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
			oos.writeObject(t1);
			oos.writeObject(t2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(oos != null) {
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	/*
	 * 對象的反序列化過程:將硬盤中的文件通過ObjectInputStream轉換成相應的對象
	 */
	@Test
	public void test2() {
		 ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(new FileInputStream("oos.txt"));
			 TestObject p1 = (TestObject) ois.readObject();
			 System.out.println(p1);
			 TestObject p2 = (TestObject) ois.readObject();
			 System.out.println(p2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(ois != null) {
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		 
	}
}

/*
 * 要實現序列化的類:
 * 1.要求此類是可序列化的,實現Serializable接口
 * 2.要求類的屬性同樣的要實現Serializable接口
 * 3.提供一個版本號:private static final long serialVersionUID
 * 4.使用static或transient修飾的屬性,不可實現序列化(不會報錯,但是值都是空的)
 */
class TestObject implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 435658857576587L;
	String name;//String類已實現Serializable接口
	int age;//Integer類的父類Number類已實現Serializable接口
	TestSubObject t;//TestSubObject也需要實現Serializable接口
	
	public TestObject(String name, int age , TestSubObject t) {
		super();
		this.name = name;
		this.age = age;
		this.t = t;
	}

	@Override
	public String toString() {
		return "TestObject [name=" + name + ", age=" + age + ", t=" + t + "]";
	}
}

class TestSubObject implements Serializable {
	String name;

	public TestSubObject(String name) {
		super();
		this.name = name;
	}

	@Override
	public String toString() {
		return "TestSubObject [name=" + name + "]";
	}
}


發佈了49 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章