【正文】
07 23 對(duì)象的輸入 /輸出 DataInputStream類和 DataOutputStream類可以實(shí)現(xiàn)基本數(shù)據(jù)類型與字符串的輸入和輸出。而 ObjectInputStream類和ObjectOutputStream類除了可以實(shí)現(xiàn)基本數(shù)據(jù)類型與字符串的輸入和輸出之外,還可以實(shí)現(xiàn)對(duì)象的輸入和輸出。 I n p u t S t r e a m O u t p u t S t re a m O b j e ct O b j e ct O u t p u t S t r e am F i l t e r O u t p u t S t r e am F i l e O u t p u t S t r e am B u f f e r e d I n p u t S t r e am D at aI n p u t S t r e am B u f f e r e d O u t p u t S t r e am D at aO u t p u t S t r e am P r i n t S t r e am O b j e ct I n p u t S t r e am F i l t e r I n p u t S t r e am F i l eI n p u t S t r e am 可選的 Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 24 ObjectInputStream ObjectInputStream擴(kuò)展 InputStream類,并實(shí)現(xiàn)ObjectInput和 ObjectStream。 j a va .i o .O b j e ct I n p u t + rea d O b j e ct ( ) : O b j e ct Re ad s an o b j e ct . j a va .i o .I n p u t S t r e a m j av a. i o .O b j e ct I n p u t S t r e am +O b j e c t I n p u t S t r e am ( i n : I n p u t S t r e am ) j a va .i o .D a t a I n p u t O b j e ct S t r e a m C o n s t a n t s Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 25 ObjectOutputStream ObjectOutputStream擴(kuò)展 OutputStream類,并實(shí)現(xiàn)接口 ObjectOutput與 ObjectStream。 ja va .i o .O b je ct O u t p u t + wr i te O b je ct ( o : O b je ct ) : v o id 寫入一個(gè)對(duì)象 ja va .i o .O u t p u tS tre a m ja v a. io .O b je ct O u t p u tS tr e am +O b je c tO u tp u tS tr e am ( o u t: O u t p u tS tr e am ) ja va .i o .D a t a O u tp u t O b je ct S tr e a m C o n s ta n ts Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 26 使用對(duì)象流 可以使用下面的構(gòu)造方法包裝任何一個(gè) InputStream和OutputStream上的 ObjectInputStream和 ObjectOutputStream: // Create an ObjectInputStream public ObjectInputStream(InputStream in) // Create an ObjectOutputStream public ObjectOutputStream(OutputStream out) TestObjectOutputStream Run TestObjectInputStream Run Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 27 Serializable接口 并不是每一個(gè)對(duì)象都可以寫到輸出流??梢詫懭胼敵隽髦械膶?duì)象被稱為可序列化的( serializable)。因?yàn)榭尚蛄谢膶?duì)象是,所以,可序列化對(duì)象的類必須實(shí)現(xiàn) Serializable接口。 Serializable接口是一種標(biāo)記性接口。因?yàn)樗鼪]有方法,所以,不需要在類中為實(shí)現(xiàn) Serializable接口增加額外的代碼。 實(shí)現(xiàn)這個(gè)接口可以啟動(dòng) Java的序列化機(jī)制,自動(dòng)完成存儲(chǔ)對(duì)象和數(shù)組的過程。 Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 28 關(guān)鍵字 transient 如果一個(gè)對(duì)象是 Serializable的實(shí)例,但它包含的都是非序列化的數(shù)據(jù)域,那么可以序列化這個(gè)對(duì)象嗎?答案是否定的。為了使該對(duì)象是可序列化的,需要給這些數(shù)據(jù)域加上關(guān)鍵字 transient,告訴 Java虛擬機(jī)將對(duì)象流時(shí)忽略這些數(shù)據(jù)域。 Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 29 關(guān)鍵字 transient(續(xù)) 考慮下面的類: public class Foo implements { private int v1。 private static double v2。 private transient A v3 = new A()。 } class A { } // A is not serializable 當(dāng)序列化 Foo類的一個(gè)對(duì)象時(shí),只需序列化變量 v1。因?yàn)?v2是一個(gè)靜態(tài)變量,所以沒有序列化。因?yàn)?v3被標(biāo)記為 transient,所以也沒有序列化。如果 v3沒有標(biāo)記為 transient,將會(huì)發(fā)生異常。 Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 30 序列化數(shù)組 只有當(dāng)數(shù)組中的所有元素都是可序列化的,這個(gè)數(shù)組才是可序列化的。所以,一個(gè)完整的數(shù)組可以用writeObject方法存入文件,隨后用 readObject方法恢復(fù)。程序清單 int元素構(gòu)成的數(shù)組、由三個(gè)字符串構(gòu)成的數(shù)組以及由兩個(gè) JButton對(duì)象構(gòu)成的數(shù)組,然后將它們從文件中讀取出來顯示在控制臺(tái)上。 TestObjectStreamForArray Run Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 31 隨機(jī)訪問文件 目前,你已經(jīng)使用過的所有數(shù)據(jù)流都是只讀或只寫的。這些數(shù)據(jù)流的外部文件都是順序文件,如果不創(chuàng)建新文件就不能更新它們。經(jīng)常需要修改文件或向文件中插入新紀(jì)錄。 Java提供了 RandomAccessFile類,允許在文件內(nèi)的隨機(jī)位置上進(jìn)行讀寫。 Liang, Introduction to Java Programming, Eighth Edition, (c) 2021 Pearson Education, Inc. All rights reserved. 0132130807 32 RandomAccessFile 創(chuàng)建一個(gè)帶指定 F i l e 對(duì)象和模式的 Ra n d o m A cc e ss F i l e 流 創(chuàng)建一個(gè)帶指定文件名、字符串和模式的 Ra n d o m A cc e ss F i l e 流 關(guān)閉流并釋放和這個(gè)流相關(guān)的資源 返回偏移量,以字節(jié)為單位,從文件開始位置到下一個(gè) r e ad 或w r i t e 發(fā)生的地方 返回這個(gè)文件的長度 從這個(gè)文件讀取一個(gè)字節(jié)的數(shù)據(jù)并在流的末尾處返回 1 從這個(gè)文件讀取最大為 b .l e n g t h 字節(jié)的數(shù)據(jù)給字節(jié)數(shù)組 從這個(gè)文件讀取最大為 l e n 字節(jié)的數(shù)據(jù)給字節(jié)數(shù)組 設(shè)置從流的起始位置到下一個(gè) r e ad 或 w r i t e 發(fā)生的位置之間的偏移量( 在 p o s 中指定的