鴻蒙OS ObjectInputStream

2022-10-20 17:10 更新

ObjectInputStream

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ù)摘要

修飾符 構(gòu)造函數(shù) 描述
protected ObjectInputStream() 為完全重新實現(xiàn) ObjectInputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectInputStream 的實現(xiàn)使用的私有數(shù)據(jù)。
ObjectInputStream(InputStream in) 創(chuàng)建一個從指定 InputStream 讀取的 ObjectInputStream。

方法總結(jié)

修飾符和類型 方法 描述
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

構(gòu)造函數(shù)詳細(xì)信息

ObjectInputStream

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 為空

ObjectInputStream

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 錯誤

方法詳情

readObject

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)異常。

readObjectOverride

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

readUnshared

public Object readUnshared() throws ClassNotFoundException, IOException

從 ObjectInputStream 中讀取一個“非共享”對象。 此方法與 readObject 相同,只是它阻止對 readObject 和 readUnshared 的后續(xù)調(diào)用返回對通過此調(diào)用獲得的反序列化實例的附加引用。 具體來說:

  • 如果調(diào)用 readUnshared 來反序列化反向引用(之前已寫入流的對象的流表示),將拋出 ObjectStreamException。
  • 如果 readUnshared 成功返回,則任何后續(xù)嘗試反序列化對由 readUnshared 反序列化的流句柄的反向引用將導(dǎo)致拋出 ObjectStreamException。

通過 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

defaultReadObject

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)前沒有讀取對象。

readFields

public ObjectInputStream.GetField readFields() throws ClassNotFoundException, IOException

從流中讀取持久字段并通過名稱使它們可用。

返回:

表示正在反序列化的對象的持久字段的 GetField 對象

Throws:

Throw名稱 Throw描述
ClassNotFoundException 如果找不到序列化對象的類。
IOException 如果發(fā)生 I/O 錯誤。
NotActiveException 如果流當(dāng)前沒有讀取對象。

Since:

1.2

registerValidation

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 驗證對象為空。

resolveClass

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 如果找不到序列化對象的類。

resolveProxyClass

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

resolveObject

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 任何常見的輸入/輸出異常。

enableResolveObject

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 方法拒絕啟用流以允許從流中讀取的對象被替換。

readStreamHeader

protected void readStreamHeader() throws IOException, StreamCorruptedException

提供 readStreamHeader 方法是為了允許子類讀取和驗證它們自己的流標(biāo)頭。 它讀取并驗證幻數(shù)和版本號。

Throws:

Throw名稱 Throw描述
IOException 如果從底層 InputStream 讀取時出現(xiàn) I/O 錯誤
StreamCorruptedException 如果流中的控制信息不一致

readClassDescriptor

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

read

public int read() throws IOException

讀取一個字節(jié)的數(shù)據(jù)。 如果沒有可用的輸入,此方法將阻塞。

指定者:

讀入接口 ObjectInput

指定者:

讀入類 InputStream

返回:

讀取的字節(jié),如果到達(dá)流的末尾,則為 -1。

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯誤。

read

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 錯誤。

available

public int available() throws IOException

返回可以在不阻塞的情況下讀取的字節(jié)數(shù)。

指定者:

在接口 ObjectInput 中可用

覆蓋:

在類 InputStream 中可用

返回:

可用字節(jié)數(shù)。

Throws:

Throw名稱 Throw描述
IOException 如果從底層 InputStream 讀取時出現(xiàn) I/O 錯誤

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 錯誤。

readBoolean

public boolean readBoolean() throws IOException

以布爾值讀取。

指定者:

接口 DataInput 中的 readBoolean

返回:

布爾讀取。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readByte

public byte readByte() throws IOException

讀取一個 8 位字節(jié)。

指定者:

接口 DataInput 中的 readByte

返回:

8位字節(jié)讀取。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readUnsignedByte

public int readUnsignedByte() throws IOException

讀取一個無符號的 8 位字節(jié)。

指定者:

接口 DataInput 中的 readUnsignedByte

返回:

8位字節(jié)讀取。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readChar

public char readChar() throws IOException

讀取 16 位字符。

指定者:

接口 DataInput 中的 readChar

返回:

讀取 16 位字符。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readShort

public short readShort() throws IOException

讀取 16 位短。

指定者:

接口 DataInput 中的 readShort

返回:

16位短讀。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readUnsignedShort

public int readUnsignedShort() throws IOException

讀取無符號 16 位短。

指定者:

接口 DataInput 中的 readUnsignedShort

返回:

16位短讀。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readInt

public int readInt() throws IOException

讀取 32 位整數(shù)。

指定者:

接口 DataInput 中的 readInt

返回:

讀取的 32 位整數(shù)。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readLong

public long readLong() throws IOException

讀取 64 位長。

指定者:

接口 DataInput 中的 readLong

返回:

讀取 64 位長。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readFloat

public float readFloat() throws IOException

讀取 32 位浮點數(shù)。

指定者:

接口 DataInput 中的 readFloat

返回:

32 位浮點數(shù)讀取。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

readDouble

public double readDouble() throws IOException

讀取 64 位雙精度。

指定者:

接口 DataInput 中的 readDouble

返回:

64位雙讀。

Throws:

Throw名稱 Throw描述
EOFException 如果到達(dá)文件末尾。
IOException 如果發(fā)生其他 I/O 錯誤。

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 錯誤。

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 錯誤。

skipBytes

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 錯誤。

readLine

@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 錯誤

readUTF

public String readUTF() throws IOException

以修改后的 UTF-8 格式讀取字符串。

指定者:

接口 DataInput 中的 readUTF

返回:

字符串。

Throws:

Throw名稱 Throw描述
IOException 如果從底層 InputStream 讀取時出現(xiàn) I/O 錯誤
UTFDataFormatException 如果讀取的字節(jié)不代表字符串的有效修改 UTF-8 編碼
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號