1. 程式人生 > >【java程式設計】IO流之流操作物件

【java程式設計】IO流之流操作物件

流操作物件的方法:

ObjectInputStream和ObjectOutputStream兩個物件,用ObjectOutputStream儲存的物件只能用ObjectInputStream來進行讀取

Serializable序列化:

每個類在實現Serialiable序列化時,java都會根據該類的成員變數和成員函式來生成一個uid,來區分每一個不同的類,當然,也可以自己手動雲設定這個uid

設定方法為:static final long serialVersionUID = 42L;

Serializable的作用:

當某個類實現了Serializable後,使用ObjectOutputStream把此類所建立的物件儲存到檔案裡,此檔案會生成一個與此類相對應的uid,下次,用ObjectInputStream

讀取此檔案裡的物件時,就會去匹配uid相同的類。如果原來的類改變了,就會生成新的uid,此時,讀取檔案裡的物件時,就會報錯ClassNotFoundException;當然,這

裡,我們也可以固定類的uid,這時,就算檔案裡的物件所對應的類改變了,也一樣可以讀取.

Serializable作用域:

只有儲存在堆記憶體的物件,才能被序列化.如果是儲存在靜態區裡的靜態成員,是不能被序列化的.當然,如果你有不想被序列化的成員,可以在成員前加transient關鍵字

下面來一個流操作物件的例子:

import java.io.*;
class ObjectStreamDemo 
{
	public static void main(String[] args) throws IOException
	{
		readObj();
	}
	//儲存物件到檔案
	public static void WriteObj() throws IOException
	{
		//建立ObjectOutputStream物件
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("object.txt"));
		oos.writeObject(new Person("enen",2));
		oos.close();
	}
	//將檔案裡的物件讀取並列印
	public static void readObj() throws IOException
	{
		//建立ObjectInputStream讀取物件流
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream("object.txt"));
		Person p=null;
		try
		{
			p=(Person)ois.readObject();			
		}
		catch (ClassNotFoundException e)
		{
			throw new RuntimeException(e.toString());
		}
		System.out.println(p);		
	}
}

import java.io.*;
class Person implements Serializable
{
	String name;
	int age;
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public String toString()
	{
		return name+"::"+age;
	}
}