鴻蒙OS ObjectOutputStream

2022-10-21 16:38 更新

ObjectOutputStream

java.lang.Object

|---java.io.OutputStream

|---|---java.io.ObjectOutputStream

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants

ObjectOutputStream 將 Java 對(duì)象的原始數(shù)據(jù)類型和圖形寫(xiě)入 OutputStream。 可以使用 ObjectInputStream 讀取(重構(gòu))對(duì)象。 對(duì)象的持久存儲(chǔ)可以通過(guò)使用流的文件來(lái)實(shí)現(xiàn)。 如果流是網(wǎng)絡(luò)套接字流,則可以在另一個(gè)主機(jī)或另一個(gè)進(jìn)程中重構(gòu)對(duì)象。

只有支持 java.io.Serializable 接口的對(duì)象才能寫(xiě)入流。 每個(gè)可序列化對(duì)象的類都經(jīng)過(guò)編碼,包括類的類名和簽名、對(duì)象的字段和數(shù)組的值,以及從初始對(duì)象引用的任何其他對(duì)象的閉包。

writeObject 方法用于將對(duì)象寫(xiě)入流。任何對(duì)象,包括字符串和數(shù)組,都是用 writeObject 編寫(xiě)的??梢詫⒍鄠€(gè)對(duì)象或原語(yǔ)寫(xiě)入流。對(duì)象必須從相應(yīng)的 ObjectInputstream 以與寫(xiě)入時(shí)相同的類型和相同的順序讀回。

原始數(shù)據(jù)類型也可以使用 DataOutput 中的適當(dāng)方法寫(xiě)入流。也可以使用 writeUTF 方法寫(xiě)入字符串。

對(duì)象的默認(rèn)序列化機(jī)制寫(xiě)入對(duì)象的類、類簽名以及所有非瞬態(tài)和非靜態(tài)字段的值。對(duì)其他對(duì)象的引用(瞬態(tài)或靜態(tài)字段除外)也會(huì)導(dǎo)致這些對(duì)象被寫(xiě)入。使用引用共享機(jī)制對(duì)單個(gè)對(duì)象的多個(gè)引用進(jìn)行編碼,以便對(duì)象的圖形可以恢復(fù)到與原始對(duì)象寫(xiě)入時(shí)相同的形狀。

比如寫(xiě)一個(gè)ObjectInputStream中的例子可以讀取的對(duì)象:

      FileOutputStream fos = new FileOutputStream("t.tmp");
      ObjectOutputStream oos = new ObjectOutputStream(fos);


      oos.writeInt(12345);
      oos.writeObject("Today");
      oos.writeObject(new Date());


      oos.close();

在序列化和反序列化過(guò)程中需要特殊處理的類必須實(shí)現(xiàn)具有這些確切簽名的特殊方法:

 private void readObject(java.io.ObjectInputStream stream)
     throws IOException, ClassNotFoundException;
 private void writeObject(java.io.ObjectOutputStream stream)
     throws IOException
 private void readObjectNoData()
     throws ObjectStreamException;

writeObject 方法負(fù)責(zé)為其特定類寫(xiě)入對(duì)象的狀態(tài),以便相應(yīng)的 readObject 方法可以恢復(fù)它。該方法不需要關(guān)注屬于對(duì)象的超類或子類的狀態(tài)。通過(guò)使用 writeObject 方法或使用 DataOutput 支持的原始數(shù)據(jù)類型的方法將各個(gè)字段寫(xiě)入 ObjectOutputStream 來(lái)保存狀態(tài)。

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

可以通過(guò)實(shí)現(xiàn)拋出 NotSerializableException 的 writeObject 和 readObject 方法來(lái)防止對(duì)象的序列化。異常將被 ObjectOutputStream 捕獲并中止序列化過(guò)程。

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

枚舉常量的序列化方式與普通的可序列化或可外部化對(duì)象不同。枚舉常量的序列化形式僅由其名稱組成;不傳輸常量的字段值。為了序列化枚舉常量,ObjectOutputStream 寫(xiě)入常量的 name 方法返回的字符串。與其他可序列化或可外部化的對(duì)象一樣,枚舉常量可以充當(dāng)隨后出現(xiàn)在序列化流中的反向引用的目標(biāo)。無(wú)法自定義枚舉常量序列化的過(guò)程;在序列化過(guò)程中,枚舉類型定義的任何類特定的 writeObject 和 writeReplace 方法都會(huì)被忽略。同樣,任何 serialPersistentFields 或 serialVersionUID 字段聲明也將被忽略——所有枚舉類型都有一個(gè)固定的 serialVersionUID 為 0L。

原始數(shù)據(jù)(不包括可序列化字段和可外部化數(shù)據(jù))以塊數(shù)據(jù)記錄的形式寫(xiě)入 ObjectOutputStream。塊數(shù)據(jù)記錄由標(biāo)題和數(shù)據(jù)組成。塊數(shù)據(jù)頭由一個(gè)標(biāo)記和跟隨頭的字節(jié)數(shù)組成。連續(xù)的原始數(shù)據(jù)寫(xiě)入合并到一個(gè)塊數(shù)據(jù)記錄中。用于塊數(shù)據(jù)記錄的阻塞因子為 1024 字節(jié)。每個(gè)塊數(shù)據(jù)記錄將被填充到 1024 字節(jié),或者在塊數(shù)據(jù)模式終止時(shí)寫(xiě)入。對(duì) ObjectOutputStream 方法 writeObject、defaultWriteObject 和 writeFields 的調(diào)用最初會(huì)終止任何現(xiàn)有的塊數(shù)據(jù)記錄。

Since:

JDK1.1

嵌套類摘要

修飾符和類型 描述
static class ObjectOutputStream.PutField 提供對(duì)要寫(xiě)入 ObjectOutput 的持久字段的編程訪問(wèn)。

字段摘要

從接口 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 ObjectOutputStream() 為完全重新實(shí)現(xiàn) ObjectOutputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectOutputStream 的實(shí)現(xiàn)使用的私有數(shù)據(jù)。
ObjectOutputStream(OutputStream out) 創(chuàng)建一個(gè)寫(xiě)入指定 OutputStream 的 ObjectOutputStream。

方法總結(jié)

修飾符和類型 方法 描述
protected void annotateClass(Class<?> cl) 子類可以實(shí)現(xiàn)此方法以允許將類數(shù)據(jù)存儲(chǔ)在流中。
protected void annotateProxyClass(Class<?> cl) 子類可以實(shí)現(xiàn)此方法以將自定義數(shù)據(jù)與動(dòng)態(tài)代理類的描述符一起存儲(chǔ)在流中。
void close() 關(guān)閉流。
void defaultWriteObject() 將當(dāng)前類的非靜態(tài)和非瞬態(tài)字段寫(xiě)入此流。
protected void drain() 排出 ObjectOutputStream 中的所有緩沖數(shù)據(jù)。
protected boolean enableReplaceObject(boolean enable) 使流能夠替換流中的對(duì)象。
void flush() 沖洗流。
ObjectOutputStream.PutField putFields() 檢索用于緩沖要寫(xiě)入流的持久字段的對(duì)象。
protected Object replaceObject(Object obj) 此方法將允許 ObjectOutputStream 的受信任子類在序列化期間用一個(gè)對(duì)象替換另一個(gè)對(duì)象。
void reset() 重置將忽略已寫(xiě)入流的任何對(duì)象的狀態(tài)。
void useProtocolVersion(int version) 指定寫(xiě)入流時(shí)要使用的流協(xié)議版本。
void write(byte[] buf) 寫(xiě)入一個(gè)字節(jié)數(shù)組。
void write(byte[] buf, int off, int len) 寫(xiě)入一個(gè)子字節(jié)數(shù)組。
void write(int val) 寫(xiě)入一個(gè)字節(jié)。
void writeBoolean(boolean val) 寫(xiě)入一個(gè)布爾值。
void writeByte(int val) 寫(xiě)入一個(gè) 8 位字節(jié)。
void writeBytes(String str) 將 String 作為字節(jié)序列寫(xiě)入。
void writeChar(int val) 寫(xiě)入一個(gè) 16 位字符。
void writeChars(String str) 將字符串寫(xiě)入字符序列。
protected void writeClassDescriptor(ObjectStreamClass desc) 將指定的類描述符寫(xiě)入 ObjectOutputStream。
void writeDouble(double val) 寫(xiě)入 64 位雙精度。
void writeFields() 將緩沖字段寫(xiě)入流。
void writeFloat(float val) 寫(xiě)入一個(gè) 32 位浮點(diǎn)數(shù)。
void writeInt(int val) 寫(xiě)入一個(gè) 32 位整數(shù)。
void writeLong(long val) 寫(xiě)入 64 位長(zhǎng)。
void writeObject(Object obj) 將指定對(duì)象寫(xiě)入 ObjectOutputStream。
protected void writeObjectOverride(Object obj) 子類用來(lái)覆蓋默認(rèn) writeObject 方法的方法。
void writeShort(int val) 寫(xiě)入 16 位短。
protected void writeStreamHeader() 提供了 writeStreamHeader 方法,因此子類可以將自己的標(biāo)頭附加或前置到流中。
void writeUnshared(Object obj) 將“非共享”對(duì)象寫(xiě)入 ObjectOutputStream。
void writeUTF(String str) 以修改后的 UTF-8 格式寫(xiě)入此字符串的原始數(shù)據(jù)。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

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

ObjectOutputStream

public ObjectOutputStream(OutputStream out) throws IOException

創(chuàng)建一個(gè)寫(xiě)入指定 OutputStream 的 ObjectOutputStream。 此構(gòu)造函數(shù)將序列化流標(biāo)頭寫(xiě)入底層流; 調(diào)用者可能希望立即刷新流,以確保接收 ObjectInputStreams 的構(gòu)造函數(shù)在讀取標(biāo)頭時(shí)不會(huì)阻塞。

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

參數(shù):

參數(shù)名稱 參數(shù)描述
out 要寫(xiě)入的輸出流

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入流標(biāo)頭時(shí)發(fā)生 I/O 錯(cuò)誤
SecurityException 如果不受信任的子類非法覆蓋安全敏感方法
NullPointerException 如果 out 為空

Since:

1.4

ObjectOutputStream

protected ObjectOutputStream() throws IOException, SecurityException

為完全重新實(shí)現(xiàn) ObjectOutputStream 的子類提供一種方法,使其不必分配剛剛由 ObjectOutputStream 的實(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ò)誤

方法詳情

useProtocolVersion

public void useProtocolVersion(int version) throws IOException

指定寫(xiě)入流時(shí)要使用的流協(xié)議版本。

此例程提供了一個(gè)掛鉤,使當(dāng)前版本的序列化能夠以向后兼容的流格式的先前版本的格式寫(xiě)入。

將盡一切努力避免引入額外的向后不兼容; 但是,有時(shí)沒(méi)有其他選擇。

參數(shù):

參數(shù)名稱 參數(shù)描述
version 使用來(lái)自 java.io.ObjectStreamConstants 的 ProtocolVersion。

Throws:

Throw名稱 Throw描述
IllegalStateException 如果在任何對(duì)象被序列化后調(diào)用。
IllegalArgumentException 如果傳入無(wú)效版本。
IOException 如果發(fā)生 I/O 錯(cuò)誤

Since:

1.2

writeObject

public final void writeObject(Object obj) throws IOException

將指定對(duì)象寫(xiě)入 ObjectOutputStream。 寫(xiě)入對(duì)象的類、類的簽名、類的非瞬態(tài)和非靜態(tài)字段的值及其所有超類型。 可以使用 writeObject 和 readObject 方法覆蓋類的默認(rèn)序列化。 此對(duì)象引用的對(duì)象是可傳遞寫(xiě)入的,因此可以通過(guò) ObjectInputStream 重建對(duì)象的完整等效圖。

對(duì)于 OutputStream 的問(wèn)題和不應(yīng)序列化的類,將引發(fā)異常。 所有異常對(duì)于 OutputStream 來(lái)說(shuō)都是致命的,它處于不確定狀態(tài),由調(diào)用者來(lái)忽略或恢復(fù)流狀態(tài)。

指定者:

接口 ObjectOutput 中的 writeObject

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 要寫(xiě)入的對(duì)象

Throws:

Throw名稱 Throw描述
InvalidClassException 序列化使用的類有問(wèn)題。
NotSerializableException 某些要序列化的對(duì)象沒(méi)有實(shí)現(xiàn) java.io.Serializable 接口。
IOException 底層 OutputStream 引發(fā)的任何異常。

writeObjectOverride

protected void writeObjectOverride(Object obj) throws IOException

子類用來(lái)覆蓋默認(rèn) writeObject 方法的方法。 此方法由使用受保護(hù)的無(wú)參數(shù)構(gòu)造函數(shù)構(gòu)造 ObjectInputStream 的 ObjectInputStream 的受信任子類調(diào)用。 子類應(yīng)提供帶有修飾符“final”的覆蓋方法。

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 要寫(xiě)入底層流的對(duì)象

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)出現(xiàn) I/O 錯(cuò)誤

Since:

1.2

writeUnshared

public void writeUnshared(Object obj) throws IOException

將“非共享”對(duì)象寫(xiě)入 ObjectOutputStream。 此方法與 writeObject 相同,不同之處在于它始終將給定對(duì)象作為流中新的唯一對(duì)象寫(xiě)入(與指向先前序列化實(shí)例的反向引用相反)。 具體來(lái)說(shuō):

  • 通過(guò) writeUnshared 寫(xiě)入的對(duì)象始終以與新出現(xiàn)的對(duì)象(尚未寫(xiě)入流的對(duì)象)相同的方式序列化,無(wú)論該對(duì)象之前是否已寫(xiě)入。
  • 如果 writeObject 用于寫(xiě)入先前已使用 writeUnshared 寫(xiě)入的對(duì)象,則將先前的 writeUnshared 操作視為單獨(dú)對(duì)象的寫(xiě)入。 換句話說(shuō),ObjectOutputStream 永遠(yuǎn)不會(huì)生成對(duì)通過(guò)調(diào)用 writeUnshared 寫(xiě)入的對(duì)象數(shù)據(jù)的反向引用。

雖然通過(guò) writeUnshared 寫(xiě)入對(duì)象本身并不能保證在反序列化時(shí)對(duì)該對(duì)象的唯一引用,但它允許在流中多次定義單個(gè)對(duì)象,因此接收方對(duì) readUnshared 的多次調(diào)用不會(huì)發(fā)生沖突。 請(qǐng)注意,上述規(guī)則僅適用于使用 writeUnshared 編寫(xiě)的基礎(chǔ)級(jí)對(duì)象,不適用于要序列化的對(duì)象圖中的任何可傳遞引用的子對(duì)象。

覆蓋此方法的 ObjectOutputStream 子類只能在擁有“enableSubclassImplementation”SerializablePermission 的安全上下文中構(gòu)造; 任何嘗試在沒(méi)有此權(quán)限的情況下實(shí)例化此類子類都將導(dǎo)致拋出 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 要寫(xiě)入流的對(duì)象

Throws:

Throw名稱 Throw沒(méi)事
NotSerializableException 如果圖中要序列化的對(duì)象沒(méi)有實(shí)現(xiàn) Serializable 接口
InvalidClassException 如果要序列化的對(duì)象的類存在問(wèn)題
IOException 如果在序列化過(guò)程中發(fā)生 I/O 錯(cuò)誤

Since:

1.4

defaultWriteObject

public void defaultWriteObject() throws IOException

將當(dāng)前類的非靜態(tài)和非瞬態(tài)字段寫(xiě)入此流。 這只能從被序列化的類的 writeObject 方法中調(diào)用。 如果以其他方式調(diào)用它將拋出 NotActiveException。

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層 OutputStream 時(shí)發(fā)生 I/O 錯(cuò)誤

putFields

public ObjectOutputStream.PutField putFields() throws IOException

檢索用于緩沖要寫(xiě)入流的持久字段的對(duì)象。 當(dāng)調(diào)用 writeFields 方法時(shí),字段將被寫(xiě)入流。

返回:

包含可序列化字段的 Putfield 類的實(shí)例

Throws:

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

Since:

1.2

writeFields

public void writeFields() throws IOException

將緩沖字段寫(xiě)入流。

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤
NotActiveException 當(dāng)未調(diào)用類 writeObject 方法來(lái)寫(xiě)入對(duì)象的狀態(tài)時(shí)調(diào)用。

Since:

1.2

reset

public void reset() throws IOException

重置將忽略已寫(xiě)入流的任何對(duì)象的狀態(tài)。 狀態(tài)被重置為與新的 ObjectOutputStream 相同。 流中的當(dāng)前點(diǎn)被標(biāo)記為重置,因此相應(yīng)的 ObjectInputStream 將在同一點(diǎn)重置。 之前寫(xiě)入流的對(duì)象不會(huì)被稱為已經(jīng)在流中。 它們將再次寫(xiě)入流。

Throws:

Throw名稱 Throw描述
IOException 如果在序列化對(duì)象時(shí)調(diào)用了 reset()。

annotateClass

protected void annotateClass(Class<?> cl) throws IOException

子類可以實(shí)現(xiàn)此方法以允許將類數(shù)據(jù)存儲(chǔ)在流中。 默認(rèn)情況下,此方法不執(zhí)行任何操作。 ObjectInputStream 中對(duì)應(yīng)的方法是resolveClass。 對(duì)于流中的每個(gè)唯一類,該方法只調(diào)用一次。 類名和簽名將已寫(xiě)入流。 此方法可以免費(fèi)使用 ObjectOutputStream 來(lái)保存它認(rèn)為合適的類的任何表示(例如,類文件的字節(jié))。 ObjectInputStream 對(duì)應(yīng)子類中的resolveClass 方法必須讀取和使用annotateClass 寫(xiě)入的任何數(shù)據(jù)或?qū)ο蟆?/p>

參數(shù):

參數(shù)名稱 參數(shù)描述
cl 注釋自定義數(shù)據(jù)的類

Throws:

Throw名稱 Throw描述
IOException 底層 OutputStream 引發(fā)的任何異常。

annotateProxyClass

protected void annotateProxyClass(Class<?> cl) throws IOException

子類可以實(shí)現(xiàn)此方法以將自定義數(shù)據(jù)與動(dòng)態(tài)代理類的描述符一起存儲(chǔ)在流中。

對(duì)于流中的每個(gè)唯一代理類描述符,該方法只調(diào)用一次。 ObjectOutputStream 中此方法的默認(rèn)實(shí)現(xiàn)不執(zhí)行任何操作。

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

參數(shù):

參數(shù)名稱 參數(shù)描述
cl 用于注釋自定義數(shù)據(jù)的代理類

Throws:

Throw名稱 Throw描述
IOException 底層 OutputStream 拋出的任何異常

Since:

1.3

replaceObject

protected Object replaceObject(Object obj) throws IOException

此方法將允許 ObjectOutputStream 的受信任子類在序列化期間用一個(gè)對(duì)象替換另一個(gè)對(duì)象。在調(diào)用 enableReplaceObject 之前,禁用替換對(duì)象。 enableReplaceObject 方法檢查請(qǐng)求進(jìn)行替換的流是否可信。寫(xiě)入序列化流的每個(gè)對(duì)象的第一次出現(xiàn)被傳遞給replaceObject。對(duì)該對(duì)象的后續(xù)引用被替換為原始調(diào)用replaceObject 返回的對(duì)象。為了確保對(duì)象的私有狀態(tài)不會(huì)被無(wú)意暴露,只有受信任的流可以使用 replaceObject。

ObjectOutputStream.writeObject 方法采用 Object 類型(與 Serializable 類型相反)的參數(shù),以允許將不可序列化對(duì)象替換為可序列化對(duì)象的情況。

當(dāng)子類替換對(duì)象時(shí),它必須確保在反序列化期間必須進(jìn)行補(bǔ)充替換,或者確保替換的對(duì)象與將存儲(chǔ)引用的每個(gè)字段兼容。類型不是字段或數(shù)組元素類型的子類的對(duì)象通過(guò)引發(fā)異常中止序列化并且不存儲(chǔ)該對(duì)象。

此方法僅在第一次遇到每個(gè)對(duì)象時(shí)調(diào)用一次。對(duì)該對(duì)象的所有后續(xù)引用都將重定向到新對(duì)象。此方法應(yīng)返回要替換的對(duì)象或原始對(duì)象。

Null 可以作為要替換的對(duì)象返回,但可能會(huì)在包含對(duì)原始對(duì)象的引用的類中導(dǎo)致 NullReferenceException,因?yàn)樗鼈兛赡芷谕粋€(gè)對(duì)象而不是 null。

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 被替換的對(duì)象

返回:

替換指定對(duì)象的替代對(duì)象

Throws:

Throw名稱 Throw描述
IOException 底層 OutputStream 引發(fā)的任何異常。

enableReplaceObject

protected boolean enableReplaceObject(boolean enable) throws SecurityException

使流能夠替換流中的對(duì)象。 啟用后,將為每個(gè)正在序列化的對(duì)象調(diào)用 replaceObject 方法。

如果 enable 為 true,并且安裝了安全管理器,此方法首先調(diào)用安全管理器的 checkPermission 方法,并具有 SerializablePermission("enableSubstitution") 權(quán)限,以確??梢詥⒂昧鱽?lái)替換流中的對(duì)象。

參數(shù):

參數(shù)名稱 參數(shù)描述
enable 用于啟用對(duì)象替換的布爾參數(shù)

返回:

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

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法拒絕啟用流來(lái)替換流中的對(duì)象。

writeStreamHeader

protected void writeStreamHeader() throws IOException

提供了 writeStreamHeader 方法,因此子類可以將自己的標(biāo)頭附加或前置到流中。 它將幻數(shù)和版本寫(xiě)入流。

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeClassDescriptor

protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException

將指定的類描述符寫(xiě)入 ObjectOutputStream。 類描述符用于標(biāo)識(shí)寫(xiě)入流的對(duì)象的類。 ObjectOutputStream 的子類可以重寫(xiě)此方法以自定義將類描述符寫(xiě)入序列化流的方式。 然后應(yīng)該重寫(xiě) ObjectInputStream 中的相應(yīng)方法 readClassDescriptor 以從其自定義流表示中重構(gòu)類描述符。 默認(rèn)情況下,此方法根據(jù)對(duì)象序列化規(guī)范中定義的格式寫(xiě)入類描述符。

請(qǐng)注意,僅當(dāng) ObjectOutputStream 未使用舊的序列化流格式(通過(guò)調(diào)用 ObjectOutputStream 的 useProtocolVersion 方法設(shè)置)時(shí)才會(huì)調(diào)用此方法。 如果此序列化流使用舊格式 (PROTOCOL_VERSION_1),則類描述符將以無(wú)法覆蓋或自定義的方式在內(nèi)部寫(xiě)入。

參數(shù):

參數(shù)名稱 參數(shù)描述
desc 寫(xiě)入流的類描述符

Throws:

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

Since:

1.3

write

public void write(int val) throws IOException

寫(xiě)入一個(gè)字節(jié)。 此方法將阻塞,直到實(shí)際寫(xiě)入字節(jié)。

指定者:

寫(xiě)入接口DataOutput

指定者:

寫(xiě)入接口ObjectOutput

指定者:

寫(xiě)在類 OutputStream

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入流的字節(jié)

Throws:

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

write

public void write(byte[] buf) throws IOException

寫(xiě)入一個(gè)字節(jié)數(shù)組。 此方法將阻塞,直到實(shí)際寫(xiě)入字節(jié)。

指定者:

寫(xiě)入接口DataOutput

指定者:

寫(xiě)入接口ObjectOutput

覆蓋:

寫(xiě)在類 OutputStream

參數(shù):

參數(shù)名稱 參數(shù)描述
buf 要寫(xiě)入的數(shù)據(jù)

Throws:

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

write

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

寫(xiě)入一個(gè)子字節(jié)數(shù)組。

指定者:

寫(xiě)入接口DataOutput

指定者:

寫(xiě)入接口ObjectOutput

覆蓋:

寫(xiě)在類 OutputStream

參數(shù):

參數(shù)名稱 參數(shù)描述
buf 要寫(xiě)入的數(shù)據(jù)
off 數(shù)據(jù)中的起始偏移量
len 寫(xiě)入的字節(jié)數(shù)

Throws:

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

flush

public void flush() throws IOException

沖洗流。 這將寫(xiě)入任何緩沖的輸出字節(jié)并刷新到底層流。

指定者:

在接口 Flushable 中刷新

指定者:

在接口 ObjectOutput 中刷新

覆蓋:

類 OutputStream 中的刷新

Throws:

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

drain

protected void drain() throws IOException

排出 ObjectOutputStream 中的所有緩沖數(shù)據(jù)。 與刷新類似,但不會(huì)將刷新傳播到底層流。

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

close

public void close() throws IOException

關(guān)閉流。 必須調(diào)用此方法來(lái)釋放與流關(guān)聯(lián)的任何資源。

指定者:

在接口 AutoCloseable 中關(guān)閉

指定者:

在接口Closeable中關(guān)閉

指定者:

在接口 ObjectOutput 中關(guān)閉

覆蓋:

在類 OutputStream 中關(guān)閉

Throws:

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

writeBoolean

public void writeBoolean(boolean val) throws IOException

寫(xiě)入一個(gè)布爾值。

指定者:

接口 DataOutput 中的 writeBoolean

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的布爾值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeByte

public void writeByte(int val) throws IOException

寫(xiě)入一個(gè) 8 位字節(jié)。

指定者:

接口 DataOutput 中的 writeByte

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的字節(jié)值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeShort

public void writeShort(int val) throws IOException

寫(xiě)入 16 位短。

指定者:

接口 DataOutput 中的 writeShort

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的短值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeChar

public void writeChar(int val) throws IOException

寫(xiě)入一個(gè) 16 位字符。

指定者:

接口 DataOutput 中的 writeChar

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的 char 值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeInt

public void writeInt(int val) throws IOException

寫(xiě)入一個(gè) 32 位整數(shù)。

指定者:

接口 DataOutput 中的 writeInt

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的整數(shù)值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeLong

public void writeLong(long val) throws IOException

寫(xiě)入 64 位長(zhǎng)。

指定者:

接口 DataOutput 中的 writeLong

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的長(zhǎng)值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeFloat

public void writeFloat(float val) throws IOException

寫(xiě)入一個(gè) 32 位浮點(diǎn)數(shù)。

指定者:

接口 DataOutput 中的 writeFloat

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的浮點(diǎn)值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeDouble

public void writeDouble(double val) throws IOException

寫(xiě)入 64 位雙精度。

指定者:

接口 DataOutput 中的 writeDouble

參數(shù):

參數(shù)名稱 參數(shù)描述
val 要寫(xiě)入的雙精度值

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeBytes

public void writeBytes(String str) throws IOException

將 String 作為字節(jié)序列寫(xiě)入。

指定者:

接口 DataOutput 中的 writeBytes

參數(shù):

參數(shù)名稱 參數(shù)描述
str 要寫(xiě)入的字節(jié)字符串

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeChars

public void writeChars(String str) throws IOException

將字符串寫(xiě)入字符序列。

指定者:

接口 DataOutput 中的 writeChars

參數(shù):

參數(shù)名稱 參數(shù)描述
str 要寫(xiě)入的字符串

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤

writeUTF

public void writeUTF(String str) throws IOException

以修改后的 UTF-8 格式寫(xiě)入此字符串的原始數(shù)據(jù)。 請(qǐng)注意,將字符串作為原始數(shù)據(jù)或作為對(duì)象寫(xiě)入流中存在顯著差異。 writeObject 寫(xiě)入的 String 實(shí)例最初作為 String 寫(xiě)入流中。 未來(lái)的 writeObject() 調(diào)用將字符串的引用寫(xiě)入流中。

指定者:

接口 DataOutput 中的 writeUTF

參數(shù):

參數(shù)名稱 參數(shù)描述
str 要寫(xiě)入的字符串

Throws:

Throw名稱 Throw描述
IOException 如果在寫(xiě)入底層流時(shí)發(fā)生 I/O 錯(cuò)誤
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)