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