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

Posted

技术标签:

【中文标题】Java:将对象保存在文本文件中?有现成的解决方案吗?【英文标题】:Java: Save objects in a textfile? Are there readymade solutions? 【发布时间】:2010-09-15 07:03:53 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

你不能序列化所有东西,因为有些东西序列化没有意义,但你可以解决它们。以下是关于此的引述:

Java的基本机制 序列化使用简单,但是 还有一些事情要知道。作为 之前提到过,只有对象被标记 可序列化可以持久化。这 java.lang.Object 类没有 实现该接口。所以, 并非Java中的所有对象都可以 自动坚持。好消息 是他们中的大多数——比如 AWT 和 Swing GUI 组件、字符串和 数组——可序列化。

另一方面,某些 系统级类,例如 Thread, OutputStream 及其子类,以及 套接字不可序列化。确实, 如果他们没有任何意义 是。例如,线程运行在 我的 JVM 将使用我系统的 记忆。坚持并尝试 在你的 JVM 中运行它是没有意义的 一点也不。关于的另一个重要点 java.lang.Object 没有实现 可序列化的接口是任何 您创建的仅扩展的类 对象(并且没有其他可序列化的 classes) 不可序列化,除非 你自己实现接口 (与前面的示例一样)。

这种情况提出了一个问题: 如果我们有一个类包含 线程的一个实例?在这种情况下, 我们能不能持久化它的对象 类型?答案是肯定的,只要我们 告诉序列化机制我们的 通过标记我们班级的意图 线程对象为瞬态。

【讨论】:

【参考方案2】:

您可能想查看 Effective Java 了解有关序列化的一些问题。这些通常是高级的,但如果此功能是您应用程序的核心部分,您需要提前了解它们。

示例包括安全问题、继承,以及最重要的是公开“冻结”API 并实现它的可能性(例如,跨软件版本)。同样,这些都是先进的,不应该阻止你本身。

【讨论】:

【参考方案3】:

您可以使用 Berkeley DB PersistentMap 类将您的 (Serializable) 对象保存在 Map 实现(缓存)中,该实现将它们保存到文件中。它使用起来非常简单,这意味着您不必担心将什么保存在哪里。

序列化需要注意的三点:

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

【讨论】:

【参考方案4】:

java.io.Object[Input/Output]Stream 是您需要查看的两个类。 您希望持久化到文件的任何类都需要实现 java.io.Serializable 接口。

【讨论】:

【参考方案5】:

您可能还想考虑使用 XML 编码,在我看来这比序列化更持久。使用java.beans.XMLEncoder/XMLDecoder 类。

【讨论】:

【参考方案6】:

我没用过,但谷歌代码最近发布了protobuf。

【讨论】:

【参考方案7】:

我同意 mjlee 的观点,即 Protocol Buffers from Google 是一种比原始序列化方式更好的存储对象方式。看看,你会喜欢的。

【讨论】:

【参考方案8】:

我想知道为什么没有人提到JSON,例如Jackson JSON serializer。

【讨论】:

以上是关于Java:将对象保存在文本文件中?有现成的解决方案吗?的主要内容,如果未能解决你的问题,请参考以下文章

将用户数据保存在文本文件或序列化对象中

Java将多行字符串保存到文本文件

使用 Java 将嵌套地图保存并加载到文本文件中

是否有任何现成的 xslt 文件可以将 ODF 内容 xml 转换为纯文本?

JAVA 在GUI中的文本框输入数据 保存到vector 对象中,在程序退出(按右上角的红叉)通过对象流把

使用带有保存对话框的 java 将内容导出到文本文件