2010-10-13 28 views
4

我正在尋找與Java中的ArrayList相同的數據結構,該數據結構將項目保存在磁盤而不是內存中。 java是否有這樣的數據結構? 謝謝如何保存磁盤上的列表項而不是Java中的內存

我想要一個動態結構,將項目保存在內存上,當其大小超過某個值時,將新項目保存在磁盤上,直到大小低於該值。

回答

8

你可以自己做:將ArrayList序列化到磁盤。

確保列表中的內容是可序列化的,即列表中的對象應實現Serializable接口。

然後
寫入文件:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); 
oos.writeObject(list); 
oos.flush(); 
oos.close(); 

從文件中讀取:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); 
List<YourClass> list = ois.readObject(); 
ois.close() 
+0

我想有一個動態的結構,節省了內存中,其大小超過一定值時,保存在磁盤上新的項目,直到大小低於價值的項目。 – user468889 2010-10-13 09:47:04

+1

你需要自己實現這樣的結構。圍繞ArrayList的warpper,包含「add」,「remove」和「get」metnods的包裝,可以根據需要執行檢查並序列化和反序列化 – Nivas 2010-10-13 09:57:07

+1

需求非常具體,所以我懷疑存在某個實現你想要什麼。如上所述,使用內部ArrayList和對象序列化編寫您自己的List實現聽起來像是最好的計劃。請注意,您必須實現* all * List方法,而不僅僅是添加,刪除和獲取。 – Qwerky 2010-10-13 10:19:20

2

如果您需要經常更改此ArrayList的數據,更改磁盤映像,那麼爲什麼不考慮像http://www.hibernate.org/?好吧,它比ArrayList複雜得多,但也提供了更多的特性。

+0

我想要一個動態結構,將項目保存在內存中,當其大小超過某個值時,將新項目保存在磁盤上,直到大小低於該值。 – user468889 2010-10-13 09:48:14

2

只是爲了讓一套完整的答案了:)

XStream

XStream的是一個簡單的庫 序列化對象和XML之間 一次。現在

Person joe = new Person("Joe", "Walnes"); 
joe.setPhone(new PhoneNumber(123, "1234-456")); 
joe.setFax(new PhoneNumber(123, "9999-999")); 

,將其轉換爲XML,所有你需要做的就是做一個簡單的調用XStream的:

String xml = xstream.toXML(joe); 

生成的XML看起來是這樣的:

<person> 
    <firstname>Joe</firstname> 
    <lastname>Walnes</lastname> 
    <phone> 
    <code>123</code> 
    <number>1234-456</number> 
    </phone> 
    <fax> 
    <code>123</code> 
    <number>9999-999</number> 
    </fax> 
</person> 
1

MapDB(mapdb.org)是一個將java對象持久保存到各種集合中的磁盤的庫:集合,映射,隊列。

它支持緩存,因此您可以在內存中使用最頻繁的項目。

0

看到https://dzone.com/articles/a-filebasedcollection-in-java-for-big-collections

try(FileBasedCollection<Integer> fbc = new FileBasedCollection<>()) { 
    for(int i = 1; i < 1000_000; i++) { 
    fbc.add(i); 
    } 
    long sum = 0; 
    try(FileBasedIterator<Integer> iter = fbc.iterator()) { 
    while(iter.hasNext()) { 
     Integer i = iter.next(); 
     sum += i; 
    } 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    System.out.println("sum: " + sum); 
} 
相關問題