如何在磁盘上保存列表项而不是Java中的内存

我正在寻找与Java中的ArrayList相同的数据结构,它将项目保存在磁盘上而不是内存中。 java有这样的数据结构吗? 谢谢

我希望有一个动态结构,将项目保存在内存中,当它的大小超过某个值时,将新项保存在磁盘上,直到大小低于该值。

你可以自己做:将ArrayList序列ArrayList磁盘。

确保列表的内容是可序列化的,即列表中的对象应实现Serializable接口。

然后
写入文件:

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

要从文件中读取:

 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); List list = ois.readObject(); ois.close() 

如果您需要经常更改此ArrayList中的数据,更改磁盘映像,那么为什么不考虑http://www.hibernate.org/ ? 嗯,它比ArrayList复杂得多,但也提供了更多的function。

只是为了让答案完整:)

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如下所示:

  Joe Walnes  123 1234-456   123 9999-999   

查看http://jakarta.apache.org/jcs/ 。 这提供了一种管理磁盘和RAM上的对象的方法。 另一种可能的解决方案是使用http://code.google.com/p/pcollections/

MapDB( mapdb.org )是一个库,它将java对象保存到各种集合中的磁盘:集合,映射,队列。

它支持缓存,因此您可以将最常用的项目放在内存中。

保存具有语言和传输中性优势的东西的另一种方法是使用Google的Protocol Buffers 。

请参阅https://dzone.com/articles/a-filebasedcollection-in-java-for-big-collections

 try(FileBasedCollection fbc = new FileBasedCollection<>()) { for(int i = 1; i < 1000_000; i++) { fbc.add(i); } long sum = 0; try(FileBasedIterator 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); }