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

时间:2010-10-13 08:16:10

标签: java

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

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

7 个答案:

答案 0 :(得分:12)

您可以自己执行此操作:将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()

答案 1 :(得分:2)

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

答案 2 :(得分: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>

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分: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);
}