2010-08-12 50 views
12

如何將許多可序列化的對象寫入單個文件,然後在需要時讀取一些對象?將許多java對象寫入單個文件

+0

完整的問題: 我要實現B樹。我會爲每個「節點」創建一個對象並將其存儲在文件中。現在,當我使用B樹後,我想獲取根目錄並只讀取所需的節點。 – Anupam 2010-08-12 19:11:54

+0

你還沒有說過你爲什麼要這樣做。我問的原因是,你可能錯誤地認爲,當它更可能被不必要地整理時,這種方式更快或更有效。如果你有幾百MB的數據,它可能會開始值錢,否則只需將整個結構讀入內存並訪問它即可。 – 2010-08-12 19:45:16

回答

8

你必須自己實現索引方面,但在其他方面可以這樣做。當你序列化一個對象時,你基本上會得到一個OutputStream,你可以指向任何你想要的地方。以這種方式將多個對象存儲到文件中會很簡單。

最困難的部分來當你想讀「幾個」對象退回。你如何知道如何尋找包含你想要的特定對象的文件中的位置?如果您始終按照您寫入的順序讀取對象,則從文件開始起,這不會成爲問題。但是,如果你想擁有的流的「中間」的對象隨機訪問,你將不得不想出一些方法來確定字節你感興趣的特定對象的偏移。

(此方法就什麼都沒有做同步,甚至Java的本身。你必須設計出能夠滿足您的需求和環境的方案)

+1

因此,例如。我寫'1','2','3','4'。我是否必須以「4」,「3」,「2」,「1」的形式閱讀它們?我再次用'1','2','3','4'來讀它們是沒有意義的。你能澄清一下嗎? – 2015-04-05 01:58:05

3

寫入的部分是很容易。你只需要記住,你必須一次寫下所有的對象。您不能用序列化對象創建文件,關閉它並再次打開以附加更多對象。如果您嘗試它,您將在閱讀時收到錯誤消息。

對於反序列化,我認爲你必須處理完整的文件並保留你感興趣的對象。其他的將被創建,但是會在下一次被gc收集。

3

Object[]用於存儲你的對象。它爲我工作。