對象流
ObjectInputStream ObjectOutputStream類分别是InputStream和OutputStream的子類,對象輸出流使用writeObject(Object obj)方法,将一個對象obj寫入到一個檔案,使用readObject()讀取一個對象。
構造方法:
ObjectInputStream (InputStream in)
ObjectOutputStream(OutputStream out)
當準備将一個對象寫入檔案的時候,首先用OutputStream的子類建立一個輸出流。
OutputStream outStream = new FileOutputStream("file_name");
ObjectOutputStream objstream = new ObjectOutputStream(outStream);
當使用對象流寫入或者讀取對象的時候,必須保證該對象是序列化的,這樣是為了保證對象能夠正确的寫入檔案,并能夠把對象正确的讀回程式。
所謂的對象的序列化就是将對象轉換成二進制資料流的一種實作手段,通過将對象序列化,可以友善的實作對象的傳輸及儲存。在Java中提供了ObejctInputStream 和ObjectOutputStream這兩個類用于序列化對象的操作。用于存儲和讀取對象的輸入輸出流類,要想實作對象的序列化需要實作Serializable接口,但是Serializable接口中沒有定義任何的方法,僅僅被用作一種标記,以被編譯器作特殊處理。
package project;
import java.io.*;
//實作Serializable 接口
class TV implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1597309922188243103L;
String name;
int price;
public void setName(String name){
this.name = name;
}
public void setPrice(int price){
this.price = price;
public String getName() {
return name;
public int getPrice() {
return price;
}
public class Main{
public static void main(String[] args) {
TV changhongTv = new TV();
changhongTv.setName("長虹電視");
changhongTv.setPrice(5678);
File file = new File("changhong");
try {
//序列化寫入檔案
OutputStream outputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(changhongTv);
objectOutputStream.close();
//序列化讀取對象
InputStream inputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
TV xinfeiTv = (TV)objectInputStream.readObject();
objectInputStream.close();
xinfeiTv.setName("新飛電視");
xinfeiTv.setPrice(6666);
System.out.println("changhong name "+changhongTv.getName());
System.out.println("changhong price "+changhongTv.getPrice());
System.out.println("xinfei name "+xinfeiTv.getName());
System.out.println("xinfei price "+xinfeiTv.getPrice());
} catch (ClassNotFoundException e) {
// TODO: handle exception
System.out.println("不能讀取對象");
}catch (IOException e) {
System.out.println(e);
}
對象的序列化的實作友善了對象間的克隆,使得複制品實體的變化不會引起原對象實體的變化。
下面是一個執行個體:
另外,Java.awt包中的Componet類是實作Serializable接口的類,是以程式可以實作把元件寫入輸出流,然後用輸入流讀取該元件的克隆。