對象流
正如數(shù)據(jù)流支持原始數(shù)據(jù)類型的I/O一樣,對象流也支持對象的I/O,大多數(shù)(但不是全部)標(biāo)準(zhǔn)類支持其對象的序列化,那些是實現(xiàn)標(biāo)記接口Serializable的。
對象流類是ObjectInputStream和ObjectOutputStream,這些類實現(xiàn)ObjectInput和ObjectOutput,它們是DataInput和DataOutput的子接口。這意味著數(shù)據(jù)流中涵蓋的所有原始數(shù)據(jù)I/O方法也在對象流中實現(xiàn),因此,對象流可以包含原始值和對象值的混合。ObjectStreams示例說明了這一點,ObjectStreams創(chuàng)建與DataStreams相同的應(yīng)用程序,并進(jìn)行了一些更改,首先,價格現(xiàn)在是BigDecimal對象,以更好地代表小數(shù)值,其次,將Calendar對象寫入數(shù)據(jù)文件,指示發(fā)票日期。
如果readObject()沒有返回預(yù)期的對象類型,則嘗試將其強(qiáng)制轉(zhuǎn)換為正確的類型可能會拋出ClassNotFoundException,在這個簡單的例子中,這不可能發(fā)生,因此我們不會嘗試捕獲異常,相反,我們通過向main方法的throws子句添加ClassNotFoundException來通知編譯器我們已經(jīng)意識到了這個問題。
復(fù)雜對象的輸出和輸入writeObject和readObject方法易于使用,但它們包含一些非常復(fù)雜的對象管理邏輯,這對像Calendar這樣的類來說并不重要,它只封裝了原始值,但是許多對象包含對其他對象的引用,如果readObject是要從流重建一個對象,它必須能夠重建原始對象所引用的所有對象,這些附加對象可能有自己的引用,依此類推。在這種情況下,writeObject遍歷整個對象引用網(wǎng)絡(luò),并將該網(wǎng)絡(luò)中的所有對象寫入流,因此,對writeObject的單個調(diào)用可能導(dǎo)致將大量對象寫入流。
下圖演示了這一點,其中調(diào)用writeObject來寫入名為a的單個對象,該對象包含對象b和c的引用,而b包含對d和e的引用,調(diào)用writeobject(a)不僅寫入a,而且寫入重建a所需的所有對象,因此該網(wǎng)絡(luò)中的其他四個對象也被寫入。當(dāng)readObject讀回a時,也會讀回其他四個對象,并保留所有原始對象引用。
你可能想知道如果同一個流上的兩個對象都包含對單個對象的引用會發(fā)生什么,當(dāng)他們被回讀時,他們都會引用一個對象嗎?答案是肯定的。一個流只能包含一個對象的副本,盡管它可以包含對該對象的任意數(shù)量的引用,因此,如果你明確地將對象寫入流兩次,那么你實際上只寫入了兩次引用,例如,如果以下代碼將對象ob寫入流兩次:
Object ob = new Object(); out.writeObject(ob); out.writeObject(ob);
每個writeObject都必須與readObject匹配,因此讀回流的代碼將如下所示:
Object ob1 = in.readObject(); Object ob2 = in.readObject();
這產(chǎn)生兩個變量ob1和ob2,它們是對單個對象的引用。
但是,如果將單個對象寫入兩個不同的流,則會有效地復(fù)制它 — 讀取兩個流的單個程序?qū)⒖吹絻蓚€不同的對象。
上一篇:數(shù)據(jù)流文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72988.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語言創(chuàng)建應(yīng)用程序的程序員的實用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...
命令行I/O 程序通常從命令行運(yùn)行,并在命令行環(huán)境中與用戶交互,Java平臺以兩種方式支持這種交互:通過標(biāo)準(zhǔn)流和控制臺。 標(biāo)準(zhǔn)流 標(biāo)準(zhǔn)流是許多操作系統(tǒng)的一個特性,默認(rèn)情況下,它們從鍵盤讀取輸入并將輸出寫入顯示器,它們還支持文件和程序之間的I/O,但該功能由命令行解釋器控制,而不是程序。 Java平臺支持三種標(biāo)準(zhǔn)流:標(biāo)準(zhǔn)輸入,可通過System.in訪問;標(biāo)準(zhǔn)輸出,可通過System.out訪問;和...
緩沖流 到目前為止,我們看到的大多數(shù)示例都使用無緩沖的I/O,這意味著每個讀取或?qū)懭胝埱蠖加傻讓硬僮飨到y(tǒng)直接處理,這可以使程序效率低得多,因為每個這樣的請求通常觸發(fā)磁盤訪問、網(wǎng)絡(luò)活動或一些相對昂貴的其他操作。 為了減少這種開銷,Java平臺實現(xiàn)了緩沖的I/O流,緩沖輸入流從稱為緩沖區(qū)的內(nèi)存區(qū)讀取數(shù)據(jù),僅當(dāng)緩沖區(qū)為空時才調(diào)用原生輸入API,類似地,緩沖輸出流將數(shù)據(jù)寫入緩沖區(qū),并且僅在緩沖區(qū)已滿時才調(diào)...
數(shù)據(jù)流 數(shù)據(jù)流支持原始數(shù)據(jù)類型值(boolean、char、byte、short、int、long、float和double)以及String值的二進(jìn)制I/O,所有數(shù)據(jù)流都實現(xiàn)DataInput接口或DataOutput接口,本節(jié)重點介紹這些接口最廣泛使用的實現(xiàn),DataInputStream和DataOutputStream。 DataStreams示例通過寫出一組數(shù)據(jù)記錄,然后再次讀取它們來演...
格式化流 實現(xiàn)格式化的流對象是PrintWriter(字符流類)或PrintStream(字節(jié)流類)的實例。 你可能需要的唯一PrintStream對象是System.out和System.err(有關(guān)這些對象的更多信息,請參閱命令行中的I/O),當(dāng)你需要創(chuàng)建格式化的輸出流時,請實例化PrintWriter,而不是PrintStream。 與所有字節(jié)和字符流對象一樣,PrintStream和Pri...
閱讀 1884·2021-11-17 09:33
閱讀 6470·2021-10-12 10:20
閱讀 2299·2021-09-22 15:50
閱讀 1783·2021-09-22 15:10
閱讀 615·2021-09-10 10:51
閱讀 618·2021-09-10 10:50
閱讀 3020·2021-08-11 11:19
閱讀 1776·2019-08-30 15:55