Java 教程(物件流)

2021-09-12 22:53:18 字數 1942 閱讀 4557

正如資料流支援原始資料型別的i/o一樣,物件流也支援物件的i/o,大多數(但不是全部)標準類支援其物件的序列化,那些是實現標記介面serializable的。

物件流類是objectinputstream和objectoutputstream,這些類實現objectinput和objectoutput,它們是datainputdataoutput的子介面。這意味著資料流中涵蓋的所有原始資料i/o方法也在物件流中實現,因此,物件流可以包含原始值和物件值的混合。objectstreams示例說明了這一點,objectstreams建立與datastreams相同的應用程式,並進行了一些更改,首先,**現在是bigdecimal物件,以更好地代表小數值,其次,將calendar物件寫入資料檔案,指示發票日期。

如果readobject()沒有返回預期的物件型別,則嘗試將其強制轉換為正確的型別可能會丟擲classnotfoundexception,在這個簡單的例子中,這不可能發生,因此我們不會嘗試捕獲異常,相反,我們通過向main方法的throws子句新增classnotfoundexception來通知編譯器我們已經意識到了這個問題。

writeobjectreadobject方法易於使用,但它們包含一些非常複雜的物件管理邏輯,這對像calendar這樣的類來說並不重要,它只封裝了原始值,但是許多物件包含對其他物件的引用,如果readobject是要從流重建乙個物件,它必須能夠重建原始物件所引用的所有物件,這些附加物件可能有自己的引用,依此類推。在這種情況下,writeobject遍歷整個物件引用網路,並將該網路中的所有物件寫入流,因此,對writeobject的單個呼叫可能導致將大量物件寫入流。

下圖演示了這一點,其中呼叫writeobject來寫入名為a的單個物件,該物件包含物件bc的引用,而b包含對de的引用,呼叫writeobject(a)不僅寫入a,而且寫入重建a所需的所有物件,因此該網路中的其他四個物件也被寫入。當readobject讀回a時,也會讀回其他四個物件,並保留所有原始物件引用。

你可能想知道如果同乙個流上的兩個物件都包含對單個物件的引用會發生什麼,當他們被回讀時,他們都會引用乙個物件嗎?答案是肯定的。乙個流只能包含乙個物件的副本,儘管它可以包含對該物件的任意數量的引用,因此,如果你明確地將物件寫入流兩次,那麼你實際上只寫入了兩次引用,例如,如果以下**將物件ob寫入流兩次:

object ob = new object();

out.writeobject(ob);

out.writeobject(ob);

每個writeobject都必須與readobject匹配,因此讀回流的**將如下所示:

object ob1 = in.readobject();

object ob2 = in.readobject();

這產生兩個變數ob1ob2,它們是對單個物件的引用。

但是,如果將單個物件寫入兩個不同的流,則會有效地複製它 — 讀取兩個流的單個程式將看到兩個不同的物件。

Java基礎鞏固系列 物件流

示例 public class testobjectintoutputstream catch exception e finally catch ioexception e 物件的序列化過程,將記憶體中的物件通過objectoutputstream轉換為二進位製流,儲存在硬碟檔案中 test pu...

緩衝流物件 緩衝流物件寫

這裡我們說一下常用的字元緩衝流物件,位元組緩衝流物件不常用。緩衝流物件寫 bufferrdreader 緩衝流物件讀 bufferred writer 如果想要使用想使用緩衝流來進行寫的操作就必須先使用字元流的寫操作。下面我們來看一下如何使用 來使用緩衝流物件進行寫。建立字元流讀取物件 需要檔案路徑...

java 使用io流物件實現檔案複製

檔案複製又分為兩種情況 1 純文字檔案複製,可以使用字元流,也可以使用位元組流 讀取檔案內容 1.1 使用字元流 filereader fr new filereader a.txt 1.2 使用位元組流 fileinoputstream fis new fileinputstream a.txt ...