Java:将对象保存在文本文件中?有现成的解决方案吗?

wel*_*ter 7 java store object flat-file

我想保存我在程序中生成的对象.重新启动后,应该自动加载数组中的所有对象.我想将它们写在一个文件中,并在重启后解析它们.除手工之外,还有其他更聪明的可能性吗?谢谢

Vin*_*vic 13

是的,您正在寻找的概念称为序列化.Sun 在这里有一个很好的教程.

想法是你想要持久化的类必须实现Serializable接口.之后,使用java.io.ObjectOutputStream.writeObject()将对象写入文件,使用java.io.ObjectInputStream.readObject()将其读回.

您无法序列化所有内容,因为有些内容对序列化没有意义,但您可以解决它们.这是关于这个的引用:

Java序列化的基本机制易于使用,但还有一些事情需要了解.如前所述,只能标记Serializable的对象.java.lang.Object类没有实现该接口.因此,并非Java中的所有对象都可以自动保留.好消息是它们中的大多数 - 如AWT和Swing GUI组件,字符串和数组 - 都是可序列化的.

另一方面,某些系统级类(如Thread,OutputStream及其子类和Socket)不可序列化.实际上,如果它们是没有任何意义的话.例如,在我的JVM中运行的线程将使用我系统的内存.坚持它并试图在你的JVM中运行它根本就没有意义.关于java.lang.Object没有实现Serializable接口的另一个要点是你创建的任何只扩展Object的类(没有其他可序列化的类)是不可序列化的,除非你自己实现接口(与前面的例子一样).

这种情况提出了一个问题:如果我们有一个包含Thread实例的类怎么办?在这种情况下,我们可以坚持这种类型的对象吗?答案是肯定的,只要我们通过将类的Thread对象标记为瞬态来告诉序列化机制我们的意图.


oxb*_*kes 4

您可以使用Berkeley DB PersistentMap类将 ( ) 对象保存SerializableMap实现(缓存)中,该实现将它们持久保存到文件中。它使用起来非常简单,意味着您不必担心将哪些内容保存在哪里。

序列化需要注意三点:

  1. 您将如何应对架构更改(即更改类包含的数据 - 例如添加新字段)
  2. 如果您的文件损坏会发生什么?程序存储所需的可靠性将影响您如何保存对象隐式包含的数据的决定。请记住,您始终可以使用关系数据库(例如MySQL),然后将此数据转换为对象
  3. 您是否需要能够在程序之外查看或查询数据?如果您想回答一些简单的问题,例如“有多少对象具有属性 X?”,该怎么办?如果您使用过(关系)数据库,则很容易做到;如果您已将内容序列化到文件中,就不那么容易了!