鴻蒙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 編寫的原始數據和對象。

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

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

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

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

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

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

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

例如,從 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();

類通過實現 java.io.Serializable 或 java.io.Externalizable 接口來控制它們的序列化方式。

實現 Serializable 接口允許對象序列化保存和恢復對象的整個狀態(tài),它允許類在寫入流和讀取流之間演變。 它自動遍歷對象之間的引用,保存和恢復整個圖形。

在序列化和反序列化過程中需要特殊處理的可序列化類應實現以下方法:

 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 方法負責使用由相應的 writeObject 方法寫入流的數據讀取和恢復其特定類的對象狀態(tài)。該方法不需要關注屬于其超類或子類的狀態(tài)。通過從 ObjectInputStream 讀取各個字段的數據并對對象的適當字段進行分配來恢復狀態(tài)。 DataInput 支持讀取原始數據類型。

任何超出相應 writeObject 方法寫入的自定義數據邊界的對象數據的讀取嘗試都將導致拋出 OptionalDataException,并且 eof 字段值為 true。超過分配數據結尾的非對象讀取將反映數據的結尾,就像它們指示流的結尾一樣:按字節(jié)讀取將返回 -1 作為字節(jié)讀取或讀取的字節(jié)數,以及原始讀取將拋出 EOFExceptions。如果沒有對應的 writeObject 方法,則默認序列化數據的結尾標志著分配數據的結尾。

從 readExternal 方法中發(fā)出的原始和對象讀取調用的行為方式相同 - 如果流已經位于相應 writeExternal 方法寫入的數據的末尾,則對象讀取將拋出 OptionalDataExceptions 并將 eof 設置為 true,按字節(jié)讀取將返回 -1,原始讀取將拋出 EOFExceptions。請注意,此行為不適用于使用舊的 ObjectStreamConstants.PROTOCOL_VERSION_1 協議編寫的流,其中 writeExternal 方法寫入的數據的結尾未劃分,因此無法檢測到。

如果序列化流未將給定類列為被反序列化對象的超類,readObjectNoData 方法負責為其特定類初始化對象的狀態(tài)。這可能發(fā)生在接收方使用與發(fā)送方不同版本的反序列化實例類的情況下,并且接收方的版本擴展了發(fā)送方版本未擴展的類。如果序列化流已被篡改,也可能發(fā)生這種情況;因此,盡管存在“敵對”或不完整的源流,但 readObjectNoData 對于正確初始化反序列化對象很有用。

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

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

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

枚舉常量的反序列化方式與普通可序列化或可外部化對象不同。枚舉常量的序列化形式僅由其名稱組成;不傳輸常量的字段值。為了反序列化一個枚舉常量,ObjectInputStream 從流中讀取常量名;然后通過使用枚舉常量的基類型和接收的常量名稱作為參數調用靜態(tài)方法 Enum.valueOf(Class, String) 來獲得反序列化的常量。與其他可序列化或可外部化的對象一樣,枚舉常量可以充當隨后出現在序列化流中的反向引用的目標。無法自定義枚舉常量的反序列化過程:在反序列化過程中,將忽略枚舉類型定義的任何特定于類的 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

構造函數摘要

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

方法總結

修飾符和類型 方法 描述
int available() 返回可以在不阻塞的情況下讀取的字節(jié)數。
void close() 關閉輸入流。
void defaultReadObject() 從此流中讀取當前類的非靜態(tài)和非瞬態(tài)字段。
protected boolean enableResolveObject(boolean enable) 啟用流以允許替換從流中讀取的對象。
int read() 讀取一個字節(jié)的數據。
int read(byte[] buf, int off, int len) 讀入一個字節(jié)數組。
boolean readBoolean() 以布爾值讀取。
byte readByte() 讀取一個 8 位字節(jié)。
char readChar() 讀取 16 位字符。
protected ObjectStreamClass readClassDescriptor() 從序列化流中讀取類描述符。
double readDouble() 讀取 64 位雙精度。
ObjectInputStream.GetField readFields() 從流中讀取持久字段并通過名稱使它們可用。
float readFloat() 讀取 32 位浮點數。
void readFully(byte[] buf) 讀取字節(jié),阻塞直到讀取所有字節(jié)。
void readFully(byte[] buf, int off, int len) 讀取字節(jié),阻塞直到讀取所有字節(jié)。
int readInt() 讀取 32 位整數。
String readLine() 已棄用。 此方法不能正確地將字節(jié)轉換為字符。
long readLong() 讀取 64 位長。
Object readObject() 從 ObjectInputStream 中讀取一個對象。
protected Object readObjectOverride() 此方法由使用受保護的無參數構造函數構造 ObjectOutputStream 的 ObjectOutputStream 的受信任子類調用。
short readShort() 讀取 16 位短。
protected void readStreamHeader() 提供 readStreamHeader 方法是為了允許子類讀取和驗證它們自己的流標頭。
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) 返回實現代理類描述符中命名的接口的代理類; 子類可以實現此方法以從流中讀取自定義數據以及動態(tài)代理類的描述符,從而允許它們?yōu)榻涌诤痛眍愂褂脗溆眉虞d機制。
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

構造函數詳細信息

ObjectInputStream

public ObjectInputStream(InputStream in) throws IOException

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

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

參數:

參數名稱 參數描述
in 要讀取的輸入流

Throws:

Throw名稱 Throw描述
StreamCorruptedException 如果流標頭不正確
IOException 如果在讀取流標頭時發(fā)生 I/O 錯誤
SecurityException 如果不受信任的子類非法覆蓋安全敏感方法
NullPointerException 如果 in 為空

ObjectInputStream

protected ObjectInputStream() throws IOException, SecurityException

為完全重新實現 ObjectInputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectInputStream 的實現使用的私有數據。

如果安裝了安全管理器,此方法首先調用安全管理器的 checkPermission 方法,并帶有 SerializablePermission("enableSubclassImplementation") 權限,以確保可以啟用子類化。

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 重建對象的完整等效圖。

當根對象的所有字段和它引用的對象完全恢復時,根對象將完全恢復。此時,對象驗證回調將根據其注冊的優(yōu)先級按順序執(zhí)行?;卣{由對象注冊(在 readObject 特殊方法中),因為它們是單獨恢復的。

對于 InputStream 的問題和不應反序列化的類會引發(fā)異常。所有異常對 InputStream 來說都是致命的,并使其處于不確定狀態(tài);由調用者忽略或恢復流狀態(tài)。

指定者:

接口 ObjectInput 中的 readObject

返回:

從流中讀取的對象

Throws:

Throw名稱 Throw描述
ClassNotFoundException 找不到序列化對象的類。
InvalidClassException 序列化使用的類有問題。
StreamCorruptedException 流中的控制信息不一致。
OptionalDataException 在流中找到原始數據而不是對象。
IOException 任何常見的輸入/輸出相關異常。

readObjectOverride

protected Object readObjectOverride() throws ClassNotFoundException, IOException

此方法由使用受保護的無參數構造函數構造 ObjectOutputStream 的 ObjectOutputStream 的受信任子類調用。 子類應提供帶有修飾符“final”的覆蓋方法。

返回:

從流中讀取的對象。

Throws:

Throw名稱 Throw描述
ClassNotFoundException 找不到序列化對象的類定義。
OptionalDataException 在流中找到原始數據而不是對象。
IOException 如果從底層流讀取時發(fā)生 I/O 錯誤

Since:

1.2

readUnshared

public Object readUnshared() throws ClassNotFoundException, IOException

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

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

通過 readUnshared 反序列化對象會使與返回對象關聯的流句柄無效。請注意,這本身并不總是保證 readUnshared 返回的引用是唯一的;反序列化的對象可以定義一個 readResolve 方法,該方法返回一個對其他方可見的對象,或者 readUnshared 可以返回一個 Class 對象或枚舉常量,可在流中的其他地方或通過外部方式獲得。如果反序列化的對象定義了一個 readResolve 方法并且該方法的調用返回一個數組,那么 readUnshared 返回該數組的一個淺克?。贿@保證了返回的數組對象是唯一的,并且不能從 ObjectInputStream 上的 readObject 或 readUnshared 調用第二次獲得,即使底層數據流已被操作。

覆蓋此方法的 ObjectInputStream 子類只能在擁有“enableSubclassImplementation”SerializablePermission 的安全上下文中構造;任何嘗試在沒有此權限的情況下實例化此類子類都將導致拋出 SecurityException。

返回:

對反序列化對象的引用

Throws:

Throw名稱 Throw描述
ClassNotFoundException 如果找不到要反序列化的對象的類
StreamCorruptedException 如果流中的控制信息不一致
ObjectStreamException 如果要反序列化的對象已經出現在流中
OptionalDataException 如果原始數據是流中的下一個
IOException 如果在反序列化過程中發(fā)生 I/O 錯誤

Since:

1.4

defaultReadObject

public void defaultReadObject() throws ClassNotFoundException, IOException

從此流中讀取當前類的非靜態(tài)和非瞬態(tài)字段。 這只能從被反序列化的類的 readObject 方法中調用。 如果以其他方式調用它將拋出 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 類似,但這些驗證是在整個圖重構后調用的。 通常,readObject 方法會將對象注冊到流中,以便在恢復所有對象時可以執(zhí)行最終的一組驗證。

參數:

參數名稱 參數描述
obj 接收驗證回調的對象。
prio 控制回調的順序;零是一個很好的默認值。 使用較大的數字更早地回調,較低的數字用于以后的回調。 在一個優(yōu)先級中,回調的處理沒有特定的順序。

Throws:

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

resolveClass

protected Class<?> resolveClass(ObjectStreamClass desc) throws ClassNotFoundException, IOException

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

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

ObjectInputStream中該方法的默認實現返回調用的結果

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

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

參數:

參數名稱 參數描述
desc ObjectStreamClass 類的實例

返回:

對應于 desc 的 Class 對象

Throws:

Throw名稱 Throw描述
IOException 任何常見的輸入/輸出異常。
ClassNotFoundException 如果找不到序列化對象的類。

resolveProxyClass

protected Class<?> resolveProxyClass(String[] interfaces) throws ClassNotFoundException, IOException

返回實現代理類描述符中命名的接口的代理類; 子類可以實現此方法以從流中讀取自定義數據以及動態(tài)代理類的描述符,從而允許它們?yōu)榻涌诤痛眍愂褂脗溆眉虞d機制。

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

ObjectOutputStream 中對應的方法是annotateProxyClass。 對于覆蓋此方法的給定 ObjectInputStream 子類,ObjectOutputStream 相應子類中的 annotateProxyClass 方法必須寫入此方法讀取的任何數據或對象。

ObjectInputStream 中此方法的默認實現返回調用 Proxy.getProxyClass 的結果,其中包含接口參數中命名的接口的 Class 對象列表。 每個接口名稱 i 的 Class 對象是調用返回的值

     Class.forName(i, false, loader) 

其中 loader 是執(zhí)行堆棧上第一個非空類加載器的加載器,如果堆棧上沒有非空類加載器(與 resolveClass 方法使用的類加載器選擇相同),則為 null。 除非任何已解析的接口是非公開的,否則 loader 的相同值也是傳遞給 Proxy.getProxyClass 的類加載器; 如果存在非公共接口,則傳遞它們的類加載器(如果遇到多個非公共接口類加載器,則拋出 IllegalAccessError)。 如果 Proxy.getProxyClass 引發(fā) IllegalArgumentException,resolveProxyClass 將引發(fā)包含 IllegalArgumentException 的 ClassNotFoundException。

參數:

參數名稱 參數描述
interfaces 在代理類描述符中反序列化的接口名稱列表

返回:

指定接口的代理類

Throws:

Throw名稱 Throw描述
IOException 底層 InputStream 拋出的任何異常
ClassNotFoundException 如果找不到代理類或任何命名接口

Since:

1.3

resolveObject

protected Object resolveObject(Object obj) throws IOException

此方法將允許 ObjectInputStream 的受信任子類在反序列化期間用一個對象替換另一個對象。在調用 enableResolveObject 之前,禁用替換對象。 enableResolveObject 方法檢查請求解析對象的流是否可信。每個對可序列化對象的引用都會傳遞給 resolveObject。為了確保對象的私有狀態(tài)不會無意暴露,只有受信任的流可以使用 resolveObject。

在讀取對象之后但在從 readObject 返回之前調用此方法。默認的 resolveObject 方法只返回相同的對象。

當子類替換對象時,它必須確保被替換的對象與將存儲引用的每個字段兼容。類型不是字段或數組元素類型的子類的對象通過引發(fā)異常中止序列化并且不存儲該對象。

此方法僅在第一次遇到每個對象時調用一次。對該對象的所有后續(xù)引用都將重定向到新對象。

參數:

參數名稱 參數描述
obj 被替換的對象

返回:

被替換的對象

Throws:

Throw名稱 Throw描述
IOException 任何常見的輸入/輸出異常。

enableResolveObject

protected boolean enableResolveObject(boolean enable) throws SecurityException

啟用流以允許替換從流中讀取的對象。 啟用后,將為每個要反序列化的對象調用 resolveObject 方法。

如果 enable 為 true,并且安裝了安全管理器,則此方法首先調用安全管理器的 checkPermission 方法,并具有 SerializablePermission("enableSubstitution") 權限,以確保可以啟用流以允許替換從流中讀取的對象。

參數:

參數名稱 參數描述
enable true 為每個被反序列化的對象啟用 resolveObject

返回:

調用此方法之前的先前設置

Throws:

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

readStreamHeader

protected void readStreamHeader() throws IOException, StreamCorruptedException

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

Throws:

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

readClassDescriptor

protected ObjectStreamClass readClassDescriptor() throws ClassNotFoundException, IOException

從序列化流中讀取類描述符。 當 ObjectInputStream 期望類描述符作為序列化流中的下一項時,將調用此方法。 ObjectInputStream 的子類可以覆蓋此方法以讀取以非標準格式編寫的類描述符(通過覆蓋 writeClassDescriptor 方法的 ObjectOutputStream 的子類)。 默認情況下,此方法根據對象序列化規(guī)范中定義的格式讀取類描述符。

返回:

類描述符讀取

Throws:

Throw名稱 Throw描述
IOException 如果發(fā)生 I/O 錯誤。
ClassNotFoundException 如果找不到類描述符表示中使用的序列化對象的 Class

Since:

1.3

read

public int read() throws IOException

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

指定者:

讀入接口 ObjectInput

指定者:

讀入類 InputStream

返回:

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

Throws:

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

read

public int read(byte[] buf, int off, int len) throws IOException

讀入一個字節(jié)數組。 此方法將阻塞,直到某些輸入可用。 考慮使用 java.io.DataInputStream.readFully 準確讀取“長度”字節(jié)。

指定者:

讀入接口 ObjectInput

覆蓋:

讀入類 InputStream

參數:

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

返回:

實際讀取的字節(jié)數,到達流末尾時返回-1。

Throws:

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

available

public int available() throws IOException

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

指定者:

在接口 ObjectInput 中可用

覆蓋:

在類 InputStream 中可用

返回:

可用字節(jié)數。

Throws:

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

close

public void close() throws IOException

關閉輸入流。 必須調用以釋放與流關聯的任何資源。

指定者:

在接口 AutoCloseable 中關閉

指定者:

在接口Closeable中關閉

指定者:

在接口 ObjectInput 中關閉

覆蓋:

在類 InputStream 中關閉

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 位整數。

指定者:

接口 DataInput 中的 readInt

返回:

讀取的 32 位整數。

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 位浮點數。

指定者:

接口 DataInput 中的 readFloat

返回:

32 位浮點數讀取。

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

參數:

參數名稱 參數描述
buf 讀取數據的緩沖區(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

參數:

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

Throws:

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

skipBytes

public int skipBytes(int len) throws IOException

跳過字節(jié)。

指定者:

接口 DataInput 中的 skipBytes

參數:

參數名稱 參數描述
len 要跳過的字節(jié)數

返回:

跳過的實際字節(jié)數。

Throws:

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

readLine

@Deprecated public String readLine() throws IOException

已棄用。 此方法不能正確地將字節(jié)轉換為字符。 有關詳細信息和替代方案,請參閱 DataInputStream。

讀取已被 \n、\r、\r\n 或 EOF 終止的行。

指定者:

接口 DataInput 中的 readLine

返回:

該行的字符串副本。

Throws:

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

readUTF

public String readUTF() throws IOException

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

指定者:

接口 DataInput 中的 readUTF

返回:

字符串。

Throws:

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號