新聞中心
ObjectInputStream

java.lang.Object
|---java.io.InputStream
|---|---java.io.ObjectInputStream
public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstantsObjectInputStream 反序列化以前使用 ObjectOutputStream 編寫的原始數(shù)據(jù)和對(duì)象。
當(dāng)分別與 FileOutputStream 和 FileInputStream 一起使用時(shí),ObjectOutputStream 和 ObjectInputStream 可以為應(yīng)用程序提供對(duì)象圖的持久存儲(chǔ)。 ObjectInputStream 用于恢復(fù)之前序列化的那些對(duì)象。 其他用途包括使用套接字流在主機(jī)之間傳遞對(duì)象或在遠(yuǎn)程通信系統(tǒng)中編組和解組參數(shù)和參數(shù)。
ObjectInputStream 確保從流創(chuàng)建的圖中所有對(duì)象的類型與 Java 虛擬機(jī)中存在的類匹配。 使用標(biāo)準(zhǔn)機(jī)制根據(jù)需要加載類。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的對(duì)象才能從流中讀取。
readObject 方法用于從流中讀取對(duì)象。 應(yīng)該使用 Java 的安全轉(zhuǎn)換來獲得所需的類型。 在 Java 中,字符串和數(shù)組是對(duì)象,在序列化過程中被視為對(duì)象。 讀取時(shí)需要將它們轉(zhuǎn)換為預(yù)期的類型。
可以使用 DataInput 上的適當(dāng)方法從流中讀取原始數(shù)據(jù)類型。
對(duì)象的默認(rèn)反序列化機(jī)制將每個(gè)字段的內(nèi)容恢復(fù)為寫入時(shí)的值和類型。反序列化過程會(huì)忽略聲明為瞬態(tài)或靜態(tài)的字段。對(duì)其他對(duì)象的引用會(huì)導(dǎo)致根據(jù)需要從流中讀取這些對(duì)象。使用參考共享機(jī)制正確恢復(fù)對(duì)象圖。反序列化時(shí)總是分配新對(duì)象,這樣可以防止現(xiàn)有對(duì)象被覆蓋。
讀取對(duì)象類似于運(yùn)行新對(duì)象的構(gòu)造函數(shù)。為對(duì)象分配內(nèi)存并初始化為零 (NULL)。為不可序列化類調(diào)用無參數(shù)構(gòu)造函數(shù),然后從流中恢復(fù)可序列化類的字段,從最接近 java.lang.object 的可序列化類開始,到對(duì)象最具體的類結(jié)束。
例如,從 ObjectOutputStream 中的示例編寫的流中讀取:
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();類通過實(shí)現(xiàn) java.io.Serializable 或 java.io.Externalizable 接口來控制它們的序列化方式。
實(shí)現(xiàn) Serializable 接口允許對(duì)象序列化保存和恢復(fù)對(duì)象的整個(gè)狀態(tài),它允許類在寫入流和讀取流之間演變。 它自動(dòng)遍歷對(duì)象之間的引用,保存和恢復(fù)整個(gè)圖形。
在序列化和反序列化過程中需要特殊處理的可序列化類應(yīng)實(shí)現(xiàn)以下方法:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;readObject 方法負(fù)責(zé)使用由相應(yīng)的 writeObject 方法寫入流的數(shù)據(jù)讀取和恢復(fù)其特定類的對(duì)象狀態(tài)。該方法不需要關(guān)注屬于其超類或子類的狀態(tài)。通過從 ObjectInputStream 讀取各個(gè)字段的數(shù)據(jù)并對(duì)對(duì)象的適當(dāng)字段進(jìn)行分配來恢復(fù)狀態(tài)。 DataInput 支持讀取原始數(shù)據(jù)類型。
任何超出相應(yīng) writeObject 方法寫入的自定義數(shù)據(jù)邊界的對(duì)象數(shù)據(jù)的讀取嘗試都將導(dǎo)致拋出 OptionalDataException,并且 eof 字段值為 true。超過分配數(shù)據(jù)結(jié)尾的非對(duì)象讀取將反映數(shù)據(jù)的結(jié)尾,就像它們指示流的結(jié)尾一樣:按字節(jié)讀取將返回 -1 作為字節(jié)讀取或讀取的字節(jié)數(shù),以及原始讀取將拋出 EOFExceptions。如果沒有對(duì)應(yīng)的 writeObject 方法,則默認(rèn)序列化數(shù)據(jù)的結(jié)尾標(biāo)志著分配數(shù)據(jù)的結(jié)尾。
從 readExternal 方法中發(fā)出的原始和對(duì)象讀取調(diào)用的行為方式相同 - 如果流已經(jīng)位于相應(yīng) writeExternal 方法寫入的數(shù)據(jù)的末尾,則對(duì)象讀取將拋出 OptionalDataExceptions 并將 eof 設(shè)置為 true,按字節(jié)讀取將返回 -1,原始讀取將拋出 EOFExceptions。請(qǐng)注意,此行為不適用于使用舊的 ObjectStreamConstants.PROTOCOL_VERSION_1 協(xié)議編寫的流,其中 writeExternal 方法寫入的數(shù)據(jù)的結(jié)尾未劃分,因此無法檢測(cè)到。
如果序列化流未將給定類列為被反序列化對(duì)象的超類,readObjectNoData 方法負(fù)責(zé)為其特定類初始化對(duì)象的狀態(tài)。這可能發(fā)生在接收方使用與發(fā)送方不同版本的反序列化實(shí)例類的情況下,并且接收方的版本擴(kuò)展了發(fā)送方版本未擴(kuò)展的類。如果序列化流已被篡改,也可能發(fā)生這種情況;因此,盡管存在“敵對(duì)”或不完整的源流,但 readObjectNoData 對(duì)于正確初始化反序列化對(duì)象很有用。
序列化不會(huì)讀取或賦值給任何未實(shí)現(xiàn) java.io.Serializable 接口的對(duì)象的字段。不可序列化的對(duì)象的子類可以是可序列化的。在這種情況下,不可序列化的類必須有一個(gè)無參數(shù)的構(gòu)造函數(shù)來允許其字段被初始化。在這種情況下,子類負(fù)責(zé)保存和恢復(fù)不可序列化類的狀態(tài)。通常情況下,該類的字段是可訪問的(公共的、包的或受保護(hù)的),或者存在可用于恢復(fù)狀態(tài)的 get 和 set 方法。
反序列化對(duì)象時(shí)發(fā)生的任何異常都將被 ObjectInputStream 捕獲并中止讀取過程。
實(shí)現(xiàn) Externalizable 接口允許對(duì)象完全控制對(duì)象序列化形式的內(nèi)容和格式。調(diào)用 Externalizable 接口的方法 writeExternal 和 readExternal 來保存和恢復(fù)對(duì)象狀態(tài)。當(dāng)由一個(gè)類實(shí)現(xiàn)時(shí),它們可以使用 ObjectOutput 和 ObjectInput 的所有方法寫入和讀取自己的狀態(tài)。對(duì)象負(fù)責(zé)處理發(fā)生的任何版本控制。
枚舉常量的反序列化方式與普通可序列化或可外部化對(duì)象不同。枚舉常量的序列化形式僅由其名稱組成;不傳輸常量的字段值。為了反序列化一個(gè)枚舉常量,ObjectInputStream 從流中讀取常量名;然后通過使用枚舉常量的基類型和接收的常量名稱作為參數(shù)調(diào)用靜態(tài)方法 Enum.valueOf(Class, String) 來獲得反序列化的常量。與其他可序列化或可外部化的對(duì)象一樣,枚舉常量可以充當(dāng)隨后出現(xiàn)在序列化流中的反向引用的目標(biāo)。無法自定義枚舉常量的反序列化過程:在反序列化過程中,將忽略枚舉類型定義的任何特定于類的 readObject、readObjectNoData 和 readResolve 方法。同樣,任何 serialPersistentFields 或 serialVersionUID 字段聲明也將被忽略——所有枚舉類型都有一個(gè)固定的 serialVersionUID 為 0L。
Since:
JDK1.1
嵌套類摘要
| 修飾符和類型 | 類 | 描述 |
|---|---|---|
| static class | ObjectInputStream.GetField | 提供對(duì)從輸入流中讀取的持久字段的訪問。 |
字段摘要
| 從接口 java.io.ObjectStreamConstants 繼承的字段 |
|---|
| baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING |
構(gòu)造函數(shù)摘要
| 修飾符 | 構(gòu)造函數(shù) | 描述 |
|---|---|---|
| protected | ObjectInputStream() | 為完全重新實(shí)現(xiàn) ObjectInputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectInputStream 的實(shí)現(xiàn)使用的私有數(shù)據(jù)。 |
| ObjectInputStream(InputStream in) | 創(chuàng)建一個(gè)從指定 InputStream 讀取的 ObjectInputStream。 |
方法總結(jié)
| 修飾符和類型 | 方法 | 描述 |
|---|---|---|
| int | available() | 返回可以在不阻塞的情況下讀取的字節(jié)數(shù)。 |
| void | close() | 關(guān)閉輸入流。 |
| void | defaultReadObject() | 從此流中讀取當(dāng)前類的非靜態(tài)和非瞬態(tài)字段。 |
| protected boolean | enableResolveObject(boolean enable) | 啟用流以允許替換從流中讀取的對(duì)象。 |
| int | read() | 讀取一個(gè)字節(jié)的數(shù)據(jù)。 |
| int | read(byte[] buf, int off, int len) | 讀入一個(gè)字節(jié)數(shù)組。 |
| boolean | readBoolean() | 以布爾值讀取。 |
| byte | readByte() | 讀取一個(gè) 8 位字節(jié)。 |
| char | readChar() | 讀取 16 位字符。 |
| protected ObjectStreamClass | readClassDescriptor() | 從序列化流中讀取類描述符。 |
| double | readDouble() | 讀取 64 位雙精度。 |
| ObjectInputStream.GetField | readFields() | 從流中讀取持久字段并通過名稱使它們可用。 |
| float | readFloat() | 讀取 32 位浮點(diǎn)數(shù)。 |
| void | readFully(byte[] buf) | 讀取字節(jié),阻塞直到讀取所有字節(jié)。 |
| void | readFully(byte[] buf, int off, int len) | 讀取字節(jié),阻塞直到讀取所有字節(jié)。 |
| int | readInt() | 讀取 32 位整數(shù)。 |
| String | readLine() | 已棄用。 此方法不能正確地將字節(jié)轉(zhuǎn)換為字符。 |
| long | readLong() | 讀取 64 位長。 |
| Object | readObject() | 從 ObjectInputStream 中讀取一個(gè)對(duì)象。 |
| protected Object | readObjectOverride() | 此方法由使用受保護(hù)的無參數(shù)構(gòu)造函數(shù)構(gòu)造 ObjectOutputStream 的 ObjectOutputStream 的受信任子類調(diào)用。 |
| short | readShort() | 讀取 16 位短。 |
| protected void | readStreamHeader() | 提供 readStreamHeader 方法是為了允許子類讀取和驗(yàn)證它們自己的流標(biāo)頭。 |
| Object | readUnshared() | 從 ObjectInputStream 中讀取一個(gè)“非共享”對(duì)象。 |
| int | readUnsignedByte() | 讀取一個(gè)無符號(hào)的 8 位字節(jié)。 |
| int | readUnsignedShort() | 讀取無符號(hào) 16 位短。 |
| String | readUTF() | 以修改后的 UTF-8 格式讀取字符串。 |
| void | registerValidation(ObjectInputValidation obj, int prio) | 在返回圖之前注冊(cè)一個(gè)要驗(yàn)證的對(duì)象。 |
| protected Class> | resolveClass(ObjectStreamClass desc) | 加載指定流類描述的本地類等價(jià)物。 |
| protected Object | resolveObject(Object obj) | 此方法將允許 ObjectInputStream 的受信任子類在反序列化期間用一個(gè)對(duì)象替換另一個(gè)對(duì)象。 |
| protected Class> | resolveProxyClass(String[] interfaces) | 返回實(shí)現(xiàn)代理類描述符中命名的接口的代理類; 子類可以實(shí)現(xiàn)此方法以從流中讀取自定義數(shù)據(jù)以及動(dòng)態(tài)代理類的描述符,從而允許它們?yōu)榻涌诤痛眍愂褂脗溆眉虞d機(jī)制。 |
| int | skipBytes(int len) | 跳過字節(jié)。 |
| 從類 java.io.InputStream 繼承的方法 |
|---|
| mark, markSupported, read, reset, skip |
| 從類 java.lang.Object 繼承的方法 |
|---|
| clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| 從接口 java.io.ObjectInput 繼承的方法 |
|---|
| read, skip |
構(gòu)造函數(shù)詳細(xì)信息
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
創(chuàng)建一個(gè)從指定 InputStream 讀取的 ObjectInputStream。 從流中讀取序列化流標(biāo)頭并進(jìn)行驗(yàn)證。 此構(gòu)造函數(shù)將阻塞,直到相應(yīng)的 ObjectOutputStream 已寫入并刷新標(biāo)頭。
如果安裝了安全管理器,則此構(gòu)造函數(shù)將在由覆蓋 ObjectInputStream.readFields 或 ObjectInputStream.readUnshared 方法的子類的構(gòu)造函數(shù)直接或間接調(diào)用時(shí)檢查“enableSubclassImplementation”SerializablePermission。
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| in | 要讀取的輸入流 |
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| StreamCorruptedException | 如果流標(biāo)頭不正確 |
| IOException | 如果在讀取流標(biāo)頭時(shí)發(fā)生 I/O 錯(cuò)誤 |
| SecurityException | 如果不受信任的子類非法覆蓋安全敏感方法 |
| NullPointerException | 如果 in 為空 |
ObjectInputStream
protected ObjectInputStream() throws IOException, SecurityException
為完全重新實(shí)現(xiàn) ObjectInputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectInputStream 的實(shí)現(xiàn)使用的私有數(shù)據(jù)。
如果安裝了安全管理器,此方法首先調(diào)用安全管理器的 checkPermission 方法,并帶有 SerializablePermission("enableSubclassImplementation") 權(quán)限,以確??梢詥⒂米宇惢?。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| SecurityException | 如果存在安全管理器并且其 checkPermission 方法拒絕啟用子類化。 |
| IOException | 如果在創(chuàng)建此流時(shí)發(fā)生 I/O 錯(cuò)誤 |
方法詳情
readObject
public final Object readObject() throws ClassNotFoundException, IOException
從 ObjectInputStream 中讀取一個(gè)對(duì)象。讀取對(duì)象的類、類的簽名以及類及其所有超類型的非瞬態(tài)和非靜態(tài)字段的值??梢允褂?writeObject 和 readObject 方法覆蓋類的默認(rèn)反序列化。此對(duì)象引用的對(duì)象被傳遞讀取,以便通過 readObject 重建對(duì)象的完整等效圖。
當(dāng)根對(duì)象的所有字段和它引用的對(duì)象完全恢復(fù)時(shí),根對(duì)象將完全恢復(fù)。此時(shí),對(duì)象驗(yàn)證回調(diào)將根據(jù)其注冊(cè)的優(yōu)先級(jí)按順序執(zhí)行?;卣{(diào)由對(duì)象注冊(cè)(在 readObject 特殊方法中),因?yàn)樗鼈兪菃为?dú)恢復(fù)的。
對(duì)于 InputStream 的問題和不應(yīng)反序列化的類會(huì)引發(fā)異常。所有異常對(duì) InputStream 來說都是致命的,并使其處于不確定狀態(tài);由調(diào)用者忽略或恢復(fù)流狀態(tài)。
指定者:
接口 ObjectInput 中的 readObject
返回:
從流中讀取的對(duì)象
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| ClassNotFoundException | 找不到序列化對(duì)象的類。 |
| InvalidClassException | 序列化使用的類有問題。 |
| StreamCorruptedException | 流中的控制信息不一致。 |
| OptionalDataException | 在流中找到原始數(shù)據(jù)而不是對(duì)象。 |
| IOException | 任何常見的輸入/輸出相關(guān)異常。 |
readObjectOverride
protected Object readObjectOverride() throws ClassNotFoundException, IOException
此方法由使用受保護(hù)的無參數(shù)構(gòu)造函數(shù)構(gòu)造 ObjectOutputStream 的 ObjectOutputStream 的受信任子類調(diào)用。 子類應(yīng)提供帶有修飾符“final”的覆蓋方法。
返回:
從流中讀取的對(duì)象。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| ClassNotFoundException | 找不到序列化對(duì)象的類定義。 |
| OptionalDataException | 在流中找到原始數(shù)據(jù)而不是對(duì)象。 |
| IOException | 如果從底層流讀取時(shí)發(fā)生 I/O 錯(cuò)誤 |
Since:
1.2
readUnshared
public Object readUnshared() throws ClassNotFoundException, IOException
從 ObjectInputStream 中讀取一個(gè)“非共享”對(duì)象。 此方法與 readObject 相同,只是它阻止對(duì) readObject 和 readUnshared 的后續(xù)調(diào)用返回對(duì)通過此調(diào)用獲得的反序列化實(shí)例的附加引用。 具體來說:
- 如果調(diào)用 readUnshared 來反序列化反向引用(之前已寫入流的對(duì)象的流表示),將拋出 ObjectStreamException。
- 如果 readUnshared 成功返回,則任何后續(xù)嘗試反序列化對(duì)由 readUnshared 反序列化的流句柄的反向引用將導(dǎo)致拋出 ObjectStreamException。
通過 readUnshared 反序列化對(duì)象會(huì)使與返回對(duì)象關(guān)聯(lián)的流句柄無效。請(qǐng)注意,這本身并不總是保證 readUnshared 返回的引用是唯一的;反序列化的對(duì)象可以定義一個(gè) readResolve 方法,該方法返回一個(gè)對(duì)其他方可見的對(duì)象,或者 readUnshared 可以返回一個(gè) Class 對(duì)象或枚舉常量,可在流中的其他地方或通過外部方式獲得。如果反序列化的對(duì)象定義了一個(gè) readResolve 方法并且該方法的調(diào)用返回一個(gè)數(shù)組,那么 readUnshared 返回該數(shù)組的一個(gè)淺克??;這保證了返回的數(shù)組對(duì)象是唯一的,并且不能從 ObjectInputStream 上的 readObject 或 readUnshared 調(diào)用第二次獲得,即使底層數(shù)據(jù)流已被操作。
覆蓋此方法的 ObjectInputStream 子類只能在擁有“enableSubclassImplementation”SerializablePermission 的安全上下文中構(gòu)造;任何嘗試在沒有此權(quán)限的情況下實(shí)例化此類子類都將導(dǎo)致拋出 SecurityException。
返回:
對(duì)反序列化對(duì)象的引用
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| ClassNotFoundException | 如果找不到要反序列化的對(duì)象的類 |
| StreamCorruptedException | 如果流中的控制信息不一致 |
| ObjectStreamException | 如果要反序列化的對(duì)象已經(jīng)出現(xiàn)在流中 |
| OptionalDataException | 如果原始數(shù)據(jù)是流中的下一個(gè) |
| IOException | 如果在反序列化過程中發(fā)生 I/O 錯(cuò)誤 |
Since:
1.4
defaultReadObject
public void defaultReadObject() throws ClassNotFoundException, IOException
從此流中讀取當(dāng)前類的非靜態(tài)和非瞬態(tài)字段。 這只能從被反序列化的類的 readObject 方法中調(diào)用。 如果以其他方式調(diào)用它將拋出 NotActiveException。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| ClassNotFoundException | 如果找不到序列化對(duì)象的類。 |
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
| NotActiveException | 如果流當(dāng)前沒有讀取對(duì)象。 |
readFields
public ObjectInputStream.GetField readFields() throws ClassNotFoundException, IOException
從流中讀取持久字段并通過名稱使它們可用。
返回:
表示正在反序列化的對(duì)象的持久字段的 GetField 對(duì)象
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| ClassNotFoundException | 如果找不到序列化對(duì)象的類。 |
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
| NotActiveException | 如果流當(dāng)前沒有讀取對(duì)象。 |
Since:
1.2
registerValidation
public void registerValidation(ObjectInputValidation obj, int prio) throws InvalidObjectException, NotActiveException
在返回圖之前注冊(cè)一個(gè)要驗(yàn)證的對(duì)象。 雖然與 resolveObject 類似,但這些驗(yàn)證是在整個(gè)圖重構(gòu)后調(diào)用的。 通常,readObject 方法會(huì)將對(duì)象注冊(cè)到流中,以便在恢復(fù)所有對(duì)象時(shí)可以執(zhí)行最終的一組驗(yàn)證。
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| obj | 接收驗(yàn)證回調(diào)的對(duì)象。 |
| prio | 控制回調(diào)的順序;零是一個(gè)很好的默認(rèn)值。 使用較大的數(shù)字更早地回調(diào),較低的數(shù)字用于以后的回調(diào)。 在一個(gè)優(yōu)先級(jí)中,回調(diào)的處理沒有特定的順序。 |
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| NotActiveException | 流當(dāng)前未讀取對(duì)象,因此注冊(cè)回調(diào)無效。 |
| InvalidObjectException | 驗(yàn)證對(duì)象為空。 |
resolveClass
protected Class> resolveClass(ObjectStreamClass desc) throws ClassNotFoundException, IOException
加載指定流類描述的本地類等價(jià)物。 子類可以實(shí)現(xiàn)此方法以允許從備用源獲取類。
ObjectOutputStream 中對(duì)應(yīng)的方法是annotateClass。 對(duì)于流中的每個(gè)唯一類,該方法只會(huì)被調(diào)用一次。 此方法可由子類實(shí)現(xiàn)以使用備用加載機(jī)制,但必須返回 Class 對(duì)象。 一旦返回,如果該類不是數(shù)組類,則將其serialVersionUID與序列化類的serialVersionUID進(jìn)行比較,如果不匹配,則反序列化失敗并拋出InvalidClassException。
ObjectInputStream中該方法的默認(rèn)實(shí)現(xiàn)返回調(diào)用的結(jié)果
Class.forName(desc.getName(), false, loader)其中 loader 確定如下:如果當(dāng)前線程的堆棧上有一個(gè)方法,其聲明類是由用戶定義的類加載器定義的(并且不是為實(shí)現(xiàn)反射調(diào)用而生成的),則 loader 是對(duì)應(yīng)于最近的類加載器 這種方法對(duì)當(dāng)前執(zhí)行的幀; 否則,加載程序?yàn)榭铡?如果此調(diào)用導(dǎo)致 ClassNotFoundException 并且傳遞的 ObjectStreamClass 實(shí)例的名稱是原始類型或 void 的 Java 語言關(guān)鍵字,則將返回表示該原始類型或 void 的 Class 對(duì)象(例如,名稱為“int”的 ObjectStreamClass " 將被解析為 Integer.TYPE)。 否則,ClassNotFoundException 將被拋出給該方法的調(diào)用者。
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| desc | ObjectStreamClass 類的實(shí)例 |
返回:
對(duì)應(yīng)于 desc 的 Class 對(duì)象
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 任何常見的輸入/輸出異常。 |
| ClassNotFoundException | 如果找不到序列化對(duì)象的類。 |
resolveProxyClass
protected Class> resolveProxyClass(String[] interfaces) throws ClassNotFoundException, IOException
返回實(shí)現(xiàn)代理類描述符中命名的接口的代理類; 子類可以實(shí)現(xiàn)此方法以從流中讀取自定義數(shù)據(jù)以及動(dòng)態(tài)代理類的描述符,從而允許它們?yōu)榻涌诤痛眍愂褂脗溆眉虞d機(jī)制。
對(duì)于流中的每個(gè)唯一代理類描述符,該方法只調(diào)用一次。
ObjectOutputStream 中對(duì)應(yīng)的方法是annotateProxyClass。 對(duì)于覆蓋此方法的給定 ObjectInputStream 子類,ObjectOutputStream 相應(yīng)子類中的 annotateProxyClass 方法必須寫入此方法讀取的任何數(shù)據(jù)或?qū)ο蟆?/p>
ObjectInputStream 中此方法的默認(rèn)實(shí)現(xiàn)返回調(diào)用 Proxy.getProxyClass 的結(jié)果,其中包含接口參數(shù)中命名的接口的 Class 對(duì)象列表。 每個(gè)接口名稱 i 的 Class 對(duì)象是調(diào)用返回的值
Class.forName(i, false, loader)其中 loader 是執(zhí)行堆棧上第一個(gè)非空類加載器的加載器,如果堆棧上沒有非空類加載器(與 resolveClass 方法使用的類加載器選擇相同),則為 null。 除非任何已解析的接口是非公開的,否則 loader 的相同值也是傳遞給 Proxy.getProxyClass 的類加載器; 如果存在非公共接口,則傳遞它們的類加載器(如果遇到多個(gè)非公共接口類加載器,則拋出 IllegalAccessError)。 如果 Proxy.getProxyClass 引發(fā) IllegalArgumentException,resolveProxyClass 將引發(fā)包含 IllegalArgumentException 的 ClassNotFoundException。
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| interfaces | 在代理類描述符中反序列化的接口名稱列表 |
返回:
指定接口的代理類
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 底層 InputStream 拋出的任何異常 |
| ClassNotFoundException | 如果找不到代理類或任何命名接口 |
Since:
1.3
resolveObject
protected Object resolveObject(Object obj) throws IOException
此方法將允許 ObjectInputStream 的受信任子類在反序列化期間用一個(gè)對(duì)象替換另一個(gè)對(duì)象。在調(diào)用 enableResolveObject 之前,禁用替換對(duì)象。 enableResolveObject 方法檢查請(qǐng)求解析對(duì)象的流是否可信。每個(gè)對(duì)可序列化對(duì)象的引用都會(huì)傳遞給 resolveObject。為了確保對(duì)象的私有狀態(tài)不會(huì)無意暴露,只有受信任的流可以使用 resolveObject。
在讀取對(duì)象之后但在從 readObject 返回之前調(diào)用此方法。默認(rèn)的 resolveObject 方法只返回相同的對(duì)象。
當(dāng)子類替換對(duì)象時(shí),它必須確保被替換的對(duì)象與將存儲(chǔ)引用的每個(gè)字段兼容。類型不是字段或數(shù)組元素類型的子類的對(duì)象通過引發(fā)異常中止序列化并且不存儲(chǔ)該對(duì)象。
此方法僅在第一次遇到每個(gè)對(duì)象時(shí)調(diào)用一次。對(duì)該對(duì)象的所有后續(xù)引用都將重定向到新對(duì)象。
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| obj | 被替換的對(duì)象 |
返回:
被替換的對(duì)象
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 任何常見的輸入/輸出異常。 |
enableResolveObject
protected boolean enableResolveObject(boolean enable) throws SecurityException
啟用流以允許替換從流中讀取的對(duì)象。 啟用后,將為每個(gè)要反序列化的對(duì)象調(diào)用 resolveObject 方法。
如果 enable 為 true,并且安裝了安全管理器,則此方法首先調(diào)用安全管理器的 checkPermission 方法,并具有 SerializablePermission("enableSubstitution") 權(quán)限,以確保可以啟用流以允許替換從流中讀取的對(duì)象。
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| enable | true 為每個(gè)被反序列化的對(duì)象啟用 resolveObject |
返回:
調(diào)用此方法之前的先前設(shè)置
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| SecurityException | 如果安全管理器存在并且其 checkPermission 方法拒絕啟用流以允許從流中讀取的對(duì)象被替換。 |
readStreamHeader
protected void readStreamHeader() throws IOException, StreamCorruptedException
提供 readStreamHeader 方法是為了允許子類讀取和驗(yàn)證它們自己的流標(biāo)頭。 它讀取并驗(yàn)證幻數(shù)和版本號(hào)。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果從底層 InputStream 讀取時(shí)出現(xiàn) I/O 錯(cuò)誤 |
| StreamCorruptedException | 如果流中的控制信息不一致 |
readClassDescriptor
protected ObjectStreamClass readClassDescriptor() throws ClassNotFoundException, IOException
從序列化流中讀取類描述符。 當(dāng) ObjectInputStream 期望類描述符作為序列化流中的下一項(xiàng)時(shí),將調(diào)用此方法。 ObjectInputStream 的子類可以覆蓋此方法以讀取以非標(biāo)準(zhǔn)格式編寫的類描述符(通過覆蓋 writeClassDescriptor 方法的 ObjectOutputStream 的子類)。 默認(rèn)情況下,此方法根據(jù)對(duì)象序列化規(guī)范中定義的格式讀取類描述符。
返回:
類描述符讀取
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
| ClassNotFoundException | 如果找不到類描述符表示中使用的序列化對(duì)象的 Class |
Since:
1.3
read
public int read() throws IOException
讀取一個(gè)字節(jié)的數(shù)據(jù)。 如果沒有可用的輸入,此方法將阻塞。
指定者:
讀入接口 ObjectInput
指定者:
讀入類 InputStream
返回:
讀取的字節(jié),如果到達(dá)流的末尾,則為 -1。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
read
public int read(byte[] buf, int off, int len) throws IOException
讀入一個(gè)字節(jié)數(shù)組。 此方法將阻塞,直到某些輸入可用。 考慮使用 java.io.DataInputStream.readFully 準(zhǔn)確讀取“長度”字節(jié)。
指定者:
讀入接口 ObjectInput
覆蓋:
讀入類 InputStream
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| buf | 讀取數(shù)據(jù)的緩沖區(qū) |
| off | 數(shù)據(jù)的起始偏移量 |
| len | 讀取的最大字節(jié)數(shù) |
返回:
實(shí)際讀取的字節(jié)數(shù),到達(dá)流末尾時(shí)返回-1。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
available
public int available() throws IOException
返回可以在不阻塞的情況下讀取的字節(jié)數(shù)。
指定者:
在接口 ObjectInput 中可用
覆蓋:
在類 InputStream 中可用
返回:
可用字節(jié)數(shù)。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果從底層 InputStream 讀取時(shí)出現(xiàn) I/O 錯(cuò)誤 |
close
public void close() throws IOException
關(guān)閉輸入流。 必須調(diào)用以釋放與流關(guān)聯(lián)的任何資源。
指定者:
在接口 AutoCloseable 中關(guān)閉
指定者:
在接口Closeable中關(guān)閉
指定者:
在接口 ObjectInput 中關(guān)閉
覆蓋:
在類 InputStream 中關(guān)閉
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
readBoolean
public boolean readBoolean() throws IOException
以布爾值讀取。
指定者:
接口 DataInput 中的 readBoolean
返回:
布爾讀取。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readByte
public byte readByte() throws IOException
讀取一個(gè) 8 位字節(jié)。
指定者:
接口 DataInput 中的 readByte
返回:
8位字節(jié)讀取。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readUnsignedByte
public int readUnsignedByte() throws IOException
讀取一個(gè)無符號(hào)的 8 位字節(jié)。
指定者:
接口 DataInput 中的 readUnsignedByte
返回:
8位字節(jié)讀取。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readChar
public char readChar() throws IOException
讀取 16 位字符。
指定者:
接口 DataInput 中的 readChar
返回:
讀取 16 位字符。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readShort
public short readShort() throws IOException
讀取 16 位短。
指定者:
接口 DataInput 中的 readShort
返回:
16位短讀。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readUnsignedShort
public int readUnsignedShort() throws IOException
讀取無符號(hào) 16 位短。
指定者:
接口 DataInput 中的 readUnsignedShort
返回:
16位短讀。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readInt
public int readInt() throws IOException
讀取 32 位整數(shù)。
指定者:
接口 DataInput 中的 readInt
返回:
讀取的 32 位整數(shù)。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readLong
public long readLong() throws IOException
讀取 64 位長。
指定者:
接口 DataInput 中的 readLong
返回:
讀取 64 位長。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readFloat
public float readFloat() throws IOException
讀取 32 位浮點(diǎn)數(shù)。
指定者:
接口 DataInput 中的 readFloat
返回:
32 位浮點(diǎn)數(shù)讀取。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readDouble
public double readDouble() throws IOException
讀取 64 位雙精度。
指定者:
接口 DataInput 中的 readDouble
返回:
64位雙讀。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readFully
public void readFully(byte[] buf) throws IOException
讀取字節(jié),阻塞直到讀取所有字節(jié)。
指定者:
接口 DataInput 中的 readFully
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| buf | 讀取數(shù)據(jù)的緩沖區(qū) |
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
readFully
public void readFully(byte[] buf, int off, int len) throws IOException
讀取字節(jié),阻塞直到讀取所有字節(jié)。
指定者:
接口 DataInput 中的 readFully
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| buf | 讀取數(shù)據(jù)的緩沖區(qū) |
| off | 數(shù)據(jù)的起始偏移量 |
| len | 要讀取的最大字節(jié)數(shù) |
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| EOFException | 如果到達(dá)文件末尾。 |
| IOException | 如果發(fā)生其他 I/O 錯(cuò)誤。 |
skipBytes
public int skipBytes(int len) throws IOException
跳過字節(jié)。
指定者:
接口 DataInput 中的 skipBytes
參數(shù):
| 參數(shù)名稱 | 參數(shù)描述 |
|---|---|
| len | 要跳過的字節(jié)數(shù) |
返回:
跳過的實(shí)際字節(jié)數(shù)。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果發(fā)生 I/O 錯(cuò)誤。 |
readLine
@Deprecated public String readLine() throws IOException
已棄用。 此方法不能正確地將字節(jié)轉(zhuǎn)換為字符。 有關(guān)詳細(xì)信息和替代方案,請(qǐng)參閱 DataInputStream。
讀取已被 \n、\r、\r\n 或 EOF 終止的行。
指定者:
接口 DataInput 中的 readLine
返回:
該行的字符串副本。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果從底層 InputStream 讀取時(shí)出現(xiàn) I/O 錯(cuò)誤 |
readUTF
public String readUTF() throws IOException
以修改后的 UTF-8 格式讀取字符串。
指定者:
接口 DataInput 中的 readUTF
返回:
字符串。
Throws:
| Throw名稱 | Throw描述 |
|---|---|
| IOException | 如果從底層 InputStream 讀取時(shí)出現(xiàn) I/O 錯(cuò)誤 |
| UTFDataFormatException | 如果讀取的字節(jié)不代表字符串的有效修改 UTF-8 編碼 |
標(biāo)題名稱:創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS ObjectInputStream
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/copihoe.html


咨詢
建站咨詢
