ObjectInputStream和ObjectOutputStream類別分別是InputStream和OutputStream類別的子類別。 ObjectInputStream和ObjectOutputStream類別所建立的物件稱為物件輸入流和物件輸出流。物件輸出流使用writeObject(Object obj)方法將一個物件obj寫入一個文件,物件輸入流使用readObject()讀取一個物件到程式中。
ObjectInputStream和ObjectOutputStream類別的建構方法如下:
ObjectOutputStream的指向應是一個輸出流對象,因此當準備將一個物件寫入到檔案時,先用OutputStream的子類別建立一個輸出流。
例如,用FileOutputStream建立一個檔案輸出流,程式碼如下:
FileOutputStreamfileOut=newFileOutputStream(tom.txt);ObjectOutputStreamobjectout=newObjectOutputStream(fileOut);
同樣ObjectInputStream的指向應為輸入流對象,因此當準備從檔案中讀入一個物件到程式中時,首先用InputStream的子類別建立一個輸入流。
例如,用FileInputStream建立一個檔案輸入流,程式碼如下:
FileInputStreamfileIn=newFileInputStream(tom.txt);ObjectInputStreamobjectIn=newObjectInputStream(fileIn);
當使用物件流寫入或讀入物件時,要確保物件是序列化的,這是為了保證能把物件寫入到文件,並能再把物件正確讀回程式中。
一個類別如果實作了Serializable介面(java.io套件中的介面),那麼這個類別所建立的物件就是所謂序列化的物件。 Java類別庫提供的絕大多數物件都是所謂序列化的。需要強調的是,Serializable介面中沒有方法,因此實作該介面的類別不需要實作額外的方法。另外要注意的是,使用物件流把一個物件寫入到檔案時不僅要保證該物件是序列化的,而且該物件的成員物件也必須是序列化的。
Serializable介面中的方法對程式是不可見的,因此實作該介面的類別不需要實作額外的方法,當把一個序列化的物件寫入到物件輸出流時,JVM就會實作Serializable介面中的方法,將一定格式的文字(物件的序列化資訊)寫入目的地。當ObjectInputStream物件流從檔案讀取物件時,就會從檔案中讀回物件的序列化訊息,並根據物件的序列化訊息建立一個物件。
例如,使用物件流讀寫TV類別建立的物件:
TV.java
importjava.io.*;publicclassTVimplementsSerializable{Stringname;intprice;publicvoidsetName(Strings){name=s;}publicvoidsetPrice(intn){price=n;}publicStringgetName(){returnname;}publicintgetPrice(){returnprice;}publicStringgetName(){returnname;}publicintgetPrice(){returnprice;}}}}
Main.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){TVchanghong=newTV();changhong.setName(長虹電視);changhong.setPrice(5678);Filefile=newFile(television.txt);try{FileOutputStreamfile (file);ObjectOutputStreamobjectOut=newObjectOutputStream(fileOut);objectOut.writeObject(changhong);objectOut.close();FileInputStreamfileIn=newFileInputStream(file);ObjectInputStreamobjectIn=newObjectInputStream(fileIn); .close();xinfei.setName(新飛電視);xinfei.setPrice(6666);System.out.println(changhong的名字:+changhong.getName());System.out.println(changhong的價格:+ changhong.getPrice());System.out.println(xinfei的名字:+xinfei.getName());System.out.println(xinfei的價格:+xinfei.getPrice());}catch(ClassNotFoundExceptionevent){System .out.println(不能讀出物件);}catch(IOExceptionevent){System.out.println(event);}}}