日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS ObjectInputStream

ObjectInputStream

java.lang.Object

|---java.io.InputStream

|---|---java.io.ObjectInputStream

public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants

ObjectInputStream 反序列化以前使用 ObjectOutputStream 編寫的原始數(shù)據(jù)和對象。

當分別與 FileOutputStream 和 FileInputStream 一起使用時,ObjectOutputStream 和 ObjectInputStream 可以為應(yīng)用程序提供對象圖的持久存儲。 ObjectInputStream 用于恢復(fù)之前序列化的那些對象。 其他用途包括使用套接字流在主機之間傳遞對象或在遠程通信系統(tǒng)中編組和解組參數(shù)和參數(shù)。

ObjectInputStream 確保從流創(chuàng)建的圖中所有對象的類型與 Java 虛擬機中存在的類匹配。 使用標準機制根據(jù)需要加載類。

只有支持 java.io.Serializable 或 java.io.Externalizable 接口的對象才能從流中讀取。

readObject 方法用于從流中讀取對象。 應(yīng)該使用 Java 的安全轉(zhuǎn)換來獲得所需的類型。 在 Java 中,字符串和數(shù)組是對象,在序列化過程中被視為對象。 讀取時需要將它們轉(zhuǎn)換為預(yù)期的類型。

可以使用 DataInput 上的適當方法從流中讀取原始數(shù)據(jù)類型。

對象的默認反序列化機制將每個字段的內(nèi)容恢復(fù)為寫入時的值和類型。反序列化過程會忽略聲明為瞬態(tài)或靜態(tài)的字段。對其他對象的引用會導(dǎo)致根據(jù)需要從流中讀取這些對象。使用參考共享機制正確恢復(fù)對象圖。反序列化時總是分配新對象,這樣可以防止現(xiàn)有對象被覆蓋。

讀取對象類似于運行新對象的構(gòu)造函數(shù)。為對象分配內(nèi)存并初始化為零 (NULL)。為不可序列化類調(diào)用無參數(shù)構(gòu)造函數(shù),然后從流中恢復(fù)可序列化類的字段,從最接近 java.lang.object 的可序列化類開始,到對象最具體的類結(jié)束。

例如,從 ObjectOutputStream 中的示例編寫的流中讀?。?/p>

      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 方法負責(zé)使用由相應(yīng)的 writeObject 方法寫入流的數(shù)據(jù)讀取和恢復(fù)其特定類的對象狀態(tài)。該方法不需要關(guān)注屬于其超類或子類的狀態(tài)。通過從 ObjectInputStream 讀取各個字段的數(shù)據(jù)并對對象的適當字段進行分配來恢復(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 方法,則默認序列化數(shù)據(jù)的結(jié)尾標志著分配數(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 方法負責(zé)為其特定類初始化對象的狀態(tài)。這可能發(fā)生在接收方使用與發(fā)送方不同版本的反序列化實例類的情況下,并且接收方的版本擴展了發(fā)送方版本未擴展的類。如果序列化流已被篡改,也可能發(fā)生這種情況;因此,盡管存在“敵對”或不完整的源流,但 readObjectNoData 對于正確初始化反序列化對象很有用。

序列化不會讀取或賦值給任何未實現(xiàn) java.io.Serializable 接口的對象的字段。不可序列化的對象的子類可以是可序列化的。在這種情況下,不可序列化的類必須有一個無參數(shù)的構(gòu)造函數(shù)來允許其字段被初始化。在這種情況下,子類負責(zé)保存和恢復(fù)不可序列化類的狀態(tài)。通常情況下,該類的字段是可訪問的(公共的、包的或受保護的),或者存在可用于恢復(fù)狀態(tài)的 get 和 set 方法。

反序列化對象時發(fā)生的任何異常都將被 ObjectInputStream 捕獲并中止讀取過程。

實現(xiàn) Externalizable 接口允許對象完全控制對象序列化形式的內(nèi)容和格式。調(diào)用 Externalizable 接口的方法 writeExternal 和 readExternal 來保存和恢復(fù)對象狀態(tài)。當由一個類實現(xiàn)時,它們可以使用 ObjectOutput 和 ObjectInput 的所有方法寫入和讀取自己的狀態(tài)。對象負責(zé)處理發(fā)生的任何版本控制。

枚舉常量的反序列化方式與普通可序列化或可外部化對象不同。枚舉常量的序列化形式僅由其名稱組成;不傳輸常量的字段值。為了反序列化一個枚舉常量,ObjectInputStream 從流中讀取常量名;然后通過使用枚舉常量的基類型和接收的常量名稱作為參數(shù)調(diào)用靜態(tài)方法 Enum.valueOf(Class, String) 來獲得反序列化的常量。與其他可序列化或可外部化的對象一樣,枚舉常量可以充當隨后出現(xiàn)在序列化流中的反向引用的目標。無法自定義枚舉常量的反序列化過程:在反序列化過程中,將忽略枚舉類型定義的任何特定于類的 readObject、readObjectNoData 和 readResolve 方法。同樣,任何 serialPersistentFields 或 serialVersionUID 字段聲明也將被忽略——所有枚舉類型都有一個固定的 serialVersionUID 為 0L。

Since:

JDK1.1

嵌套類摘要

修飾符和類型描述
static classObjectInputStream.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ù)描述
protectedObjectInputStream()為完全重新實現(xiàn) ObjectInputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectInputStream 的實現(xiàn)使用的私有數(shù)據(jù)。
ObjectInputStream(InputStream in)創(chuàng)建一個從指定 InputStream 讀取的 ObjectInputStream。

方法總結(jié)

修飾符和類型方法描述
intavailable()返回可以在不阻塞的情況下讀取的字節(jié)數(shù)。
voidclose()關(guān)閉輸入流。
voiddefaultReadObject()從此流中讀取當前類的非靜態(tài)和非瞬態(tài)字段。
protected booleanenableResolveObject(boolean enable)啟用流以允許替換從流中讀取的對象。
intread()讀取一個字節(jié)的數(shù)據(jù)。
intread(byte[] buf, int off, int len)讀入一個字節(jié)數(shù)組。
booleanreadBoolean()以布爾值讀取。
bytereadByte()讀取一個 8 位字節(jié)。
charreadChar()讀取 16 位字符。
protected ObjectStreamClassreadClassDescriptor()從序列化流中讀取類描述符。
doublereadDouble()讀取 64 位雙精度。
ObjectInputStream.GetFieldreadFields()從流中讀取持久字段并通過名稱使它們可用。
floatreadFloat()讀取 32 位浮點數(shù)。
voidreadFully(byte[] buf)讀取字節(jié),阻塞直到讀取所有字節(jié)。
voidreadFully(byte[] buf, int off, int len)讀取字節(jié),阻塞直到讀取所有字節(jié)。
intreadInt()讀取 32 位整數(shù)。
StringreadLine()已棄用。 此方法不能正確地將字節(jié)轉(zhuǎn)換為字符。
longreadLong()讀取 64 位長。
ObjectreadObject()從 ObjectInputStream 中讀取一個對象。
protected ObjectreadObjectOverride()此方法由使用受保護的無參數(shù)構(gòu)造函數(shù)構(gòu)造 ObjectOutputStream 的 ObjectOutputStream 的受信任子類調(diào)用。
shortreadShort()讀取 16 位短。
protected voidreadStreamHeader()提供 readStreamHeader 方法是為了允許子類讀取和驗證它們自己的流標頭。
ObjectreadUnshared()從 ObjectInputStream 中讀取一個“非共享”對象。
intreadUnsignedByte()讀取一個無符號的 8 位字節(jié)。
intreadUnsignedShort()讀取無符號 16 位短。
StringreadUTF()以修改后的 UTF-8 格式讀取字符串。
voidregisterValidation(ObjectInputValidation obj, int prio)在返回圖之前注冊一個要驗證的對象。
protected ClassresolveClass(ObjectStreamClass desc)加載指定流類描述的本地類等價物。
protected ObjectresolveObject(Object obj)此方法將允許 ObjectInputStream 的受信任子類在反序列化期間用一個對象替換另一個對象。
protected ClassresolveProxyClass(String[] interfaces)返回實現(xiàn)代理類描述符中命名的接口的代理類; 子類可以實現(xiàn)此方法以從流中讀取自定義數(shù)據(jù)以及動態(tài)代理類的描述符,從而允許它們?yōu)榻涌诤痛眍愂褂脗溆眉虞d機制。
intskipBytes(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ù)詳細信息

ObjectInputStream

public ObjectInputStream(InputStream in) throws IOException

創(chuàng)建一個從指定 InputStream 讀取的 ObjectInputStream。 從流中讀取序列化流標頭并進行驗證。 此構(gòu)造函數(shù)將阻塞,直到相應(yīng)的 ObjectOutputStream 已寫入并刷新標頭。

如果安裝了安全管理器,則此構(gòu)造函數(shù)將在由覆蓋 ObjectInputStream.readFields 或 ObjectInputStream.readUnshared 方法的子類的構(gòu)造函數(shù)直接或間接調(diào)用時檢查“enableSubclassImplementation”SerializablePermission。

參數(shù):

參數(shù)名稱參數(shù)描述
in要讀取的輸入流

Throws:

Throw名稱Throw描述
StreamCorruptedException如果流標頭不正確
IOException如果在讀取流標頭時發(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)限,以確??梢詥⒂米宇惢?/p>

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 方法覆蓋類的默認反序列化。此對象引用的對象被傳遞讀取,以便通過 readObject 重建對象的完整等效圖。

當根對象的所有字段和它引用的對象完全恢復(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

此方法由使用受保護的無參數(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

從此流中讀取當前類的非靜態(tài)和非瞬態(tài)字段。 這只能從被反序列化的類的 readObject 方法中調(diào)用。 如果以其他方式調(diào)用它將拋出 NotActiveException。

Throws:

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

readFields

public ObjectInputStream.GetField readFields() throws ClassNotFoundException, IOException

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

返回:

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

Throws:

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

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)的順序;零是一個很好的默認值。 使用較大的數(shù)字更早地回調(diào),較低的數(shù)字用于以后的回調(diào)。 在一個優(yōu)先級中,回調(diào)的處理沒有特定的順序。

Throws:

Throw名稱Throw描述
NotActiveException流當前未讀取對象,因此注冊回調(diào)無效。
InvalidObjectException驗證對象為空。

resolveClass

protected Class resolveClass(ObjectStreamClass desc) throws ClassNotFoundException, IOException

加載指定流類描述的本地類等價物。 子類可以實現(xiàn)此方法以允許從備用源獲取類。

ObjectOutputStream 中對應(yīng)的方法是annotateClass。 對于流中的每個唯一類,該方法只會被調(diào)用一次。 此方法可由子類實現(xiàn)以使用備用加載機制,但必須返回 Class 對象。 一旦返回,如果該類不是數(shù)組類,則將其serialVersionUID與序列化類的serialVersionUID進行比較,如果不匹配,則反序列化失敗并拋出InvalidClassException。

ObjectInputStream中該方法的默認實現(xiàn)返回調(diào)用的結(jié)果

     Class.forName(desc.getName(), false, loader)

其中 loader 確定如下:如果當前線程的堆棧上有一個方法,其聲明類是由用戶定義的類加載器定義的(并且不是為實現(xiàn)反射調(diào)用而生成的),則 loader 是對應(yīng)于最近的類加載器 這種方法對當前執(zhí)行的幀; 否則,加載程序為空。 如果此調(diào)用導(dǎo)致 ClassNotFoundException 并且傳遞的 ObjectStreamClass 實例的名稱是原始類型或 void 的 Java 語言關(guān)鍵字,則將返回表示該原始類型或 void 的 Class 對象(例如,名稱為“int”的 ObjectStreamClass " 將被解析為 Integer.TYPE)。 否則,ClassNotFoundException 將被拋出給該方法的調(diào)用者。

參數(shù):

參數(shù)名稱參數(shù)描述
descObjectStreamClass 類的實例

返回:

對應(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機制。

對于流中的每個唯一代理類描述符,該方法只調(diào)用一次。

ObjectOutputStream 中對應(yīng)的方法是annotateProxyClass。 對于覆蓋此方法的給定 ObjectInputStream 子類,ObjectOutputStream 相應(yīng)子類中的 annotateProxyClass 方法必須寫入此方法讀取的任何數(shù)據(jù)或?qū)ο蟆?/p>

ObjectInputStream 中此方法的默認實現(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)用此方法。默認的 resolveObject 方法只返回相同的對象。

當子類替換對象時,它必須確保被替換的對象與將存儲引用的每個字段兼容。類型不是字段或數(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ù)描述
enabletrue 為每個被反序列化的對象啟用 resolveObject

返回:

調(diào)用此方法之前的先前設(shè)置

Throws:

Throw名稱Throw描述
SecurityException如果安全管理器存在并且其 checkPermission 方法拒絕啟用流以允許從流中讀取的對象被替換。

readStreamHeader

protected void readStreamHeader() throws IOException, StreamCorruptedException

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

Throws:

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

readClassDescriptor

protected ObjectStreamClass readClassDescriptor() throws ClassNotFoundException, IOException

從序列化流中讀取類描述符。 當 ObjectInputStream 期望類描述符作為序列化流中的下一項時,將調(diào)用此方法。 ObjectInputStream 的子類可以覆蓋此方法以讀取以非標準格式編寫的類描述符(通過覆蓋 writeClassDescriptor 方法的 ObjectOutputStream 的子類)。 默認情況下,此方法根據(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é),如果到達流的末尾,則為 -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 準確讀取“長度”字節(jié)。

指定者:

讀入接口 ObjectInput

覆蓋:

讀入類 InputStream

參數(shù):

參數(shù)名稱參數(shù)描述
buf讀取數(shù)據(jù)的緩沖區(qū)
off數(shù)據(jù)的起始偏移量
len讀取的最大字節(jié)數(shù)

返回:

實際讀取的字節(jié)數(shù),到達流末尾時返回-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如果到達文件末尾。
IOException如果發(fā)生其他 I/O 錯誤。

readByte

public byte readByte() throws IOException

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

指定者:

接口 DataInput 中的 readByte

返回:

8位字節(jié)讀取。

Throws:

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

readUnsignedByte

public int readUnsignedByte() throws IOException

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

指定者:

接口 DataInput 中的 readUnsignedByte

返回:

8位字節(jié)讀取。

Throws:

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

readChar

public char readChar() throws IOException

讀取 16 位字符。

指定者:

接口 DataInput 中的 readChar

返回:

讀取 16 位字符。

Throws:

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

readShort

public short readShort() throws IOException

讀取 16 位短。

指定者:

接口 DataInput 中的 readShort

返回:

16位短讀。

Throws:

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

readUnsignedShort

public int readUnsignedShort() throws IOException

讀取無符號 16 位短。

指定者:

接口 DataInput 中的 readUnsignedShort

返回:

16位短讀。

Throws:

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

readInt

public int readInt() throws IOException

讀取 32 位整數(shù)。

指定者:

接口 DataInput 中的 readInt

返回:

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

Throws:

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

readLong

public long readLong() throws IOException

讀取 64 位長。

指定者:

接口 DataInput 中的 readLong

返回:

讀取 64 位長。

Throws:

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

readFloat

public float readFloat() throws IOException

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

指定者:

接口 DataInput 中的 readFloat

返回:

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

Throws:

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

readDouble

public double readDouble() throws IOException

讀取 64 位雙精度。

指定者:

接口 DataInput 中的 readDouble

返回:

64位雙讀。

Throws:

Throw名稱Throw描述
EOFException如果到達文件末尾。
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如果到達文件末尾。
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如果到達文件末尾。
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)詳細信息和替代方案,請參閱 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 編碼

當前題目:創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS ObjectInputStream
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/copihoe.html