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();
}
}