1. 程式人生 > >ObjectOutputStream 和 ObjectInputStream類的簡單介紹,及運用。

ObjectOutputStream 和 ObjectInputStream類的簡單介紹,及運用。

以前在檔案中寫入資料的主要方式是用字元流或者位元組流。但是如果想儲存並讀取一個物件,該怎麼辦?可以是用ObjectOutputStream類 和 ObjectInputStream類。

ObjecOutputStream類

常用構造方法:ObjectOutputStream oos = new ObjectOutputStream(OutputStream out);//建立一個寫入指定OutputStream的ObjectOutputStream物件.

如:ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\obj.object"));

主要方法:void writeObject(Object obj);//將指定的物件寫入ObjectOutputStream.對物件進行序列化。

注意:被寫入的物件必須實現Serializable介面。

void write(byte[] buf);

void write(byte[] buf,int off,int len);

void write(int val);//寫入一個位元組。

void writeBoolean(boolean val);

void writeByte(int val);//寫入一個八位位元組。

void writeBytes(String str);//以位元組序列形式寫入一個String。

void writeChar(int val);//寫入一個16位的char值。

viod writeChars(String str);//以char序列形式寫入一個String。

viod writeUTF(String str);//以UTF-8修改版格式寫入此String的基本資料。

ObjectInputStream類

常用構造方法:ObjectInputStream ois = new ObjectInputStream(InputStream in);//建立從指定 InputStream 讀取的 ObjectInputStream。

如:ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\obj.object"));

主要方法:Object readObject();//從ObjectInputStream讀取物件。由於其返回的是Object型別 需要對其進行強轉。

int read();//讀取單個位元組。

int read(byte[] buf,int off,int len);//讀入byte陣列,返回讀取位元組的實際個數。

boolean readBoolean();//讀取一個boolean值

byte readByte();//讀取一個8位的位元組。

char readChar();//讀取一個16為的char值。

int readInt();讀取一個32位的int值。

String readUTF();讀取一個UTF-8 修改版格式的String.

程式碼如下:

person物件類

package ObjectStream;

import java.io.Serializable;
/**
 * 繼承Serializable介面用於給該標示一個ID號。該id號有虛擬機器根據該類運算得出。
 * 
 * 用於判斷該類和obj物件檔案是否 為同一個版本。當不為同一個版本時將會丟擲無效類異常。
 * @author Administrator
 *
 */
public class Person implements Serializable/*標記介面*/{
	
	/**
	 * 由於在定義物件時需要定義一個靜態final的long欄位serialVersionUID。
	 * 如果不定義的話系統將根據該類各個方面進行計算該值,極容易導致讀取異常。
	 */
	private static final long serialVersionUID = 5201314l;
//	static 和 transient修飾符修飾得都不會被寫入到物件檔案中去。
	//非瞬態和非靜態欄位的值都將被寫入
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.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;
	}
	
}

主程式

package ObjectStream;

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

public class ObjectStreamDemo {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		writeMethod();
//		readMethod();

	}

	public static void readMethod() throws IOException, ClassNotFoundException {
		
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\obj.object"));
		Person p = (Person)ois.readObject();		
		System.out.println(p.getName()+" : "+p.getAge());
		 p = (Person)ois.readObject();		
		System.out.println(p.getName()+" : "+p.getAge());
		 p = (Person)ois.readObject();		
		System.out.println(p.getName()+" : "+p.getAge());
		 p = (Person)ois.readObject();		
		System.out.println(p.getName()+" : "+p.getAge());
		
		
	}

	public static void writeMethod() throws IOException, FileNotFoundException {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\obj.object"));
		//物件序列化。  被序列化的物件必須實現Serializable介面。 
		oos.writeObject(new Person("小強",20));
		oos.writeObject(new Person("小明",26));
		oos.writeObject(new Person("小李",25));
		oos.writeObject(new Person("李煜",19));
		oos.close();
	}

}