【问题标题】:How to Save the system state in Java and resume the system when I recompile the project?重新编译项目时如何在Java中保存系统状态并恢复系统?
【发布时间】:2020-12-01 21:26:22
【问题描述】:

我有一个 Java 系统,其中不同的类存储不同的信息。有一个主类,用户将在其中输入这些类的信息并使它们相互交互。用户完成后,他将退出系统。下次用户重新编译项目时,之前输入的所有数据都应该在那里。用户可以使用相同的数据或添加更多信息。

那么简单,如何在关闭时暂停/保存系统并在我再次执行时恢复它? PS。我不能在这个中使用数据库。一定是别的东西。

【问题讨论】:

  • 你的字面意思是重新编译吗?也就是改程序,运行新版本?如果是这样,数据的结构是否会改变,或者只是操作该数据的操作?
  • 没有。程序不会改变。刚刚重新执行。就像一开始一样,它会检查是否有一些旧数据保存在某个地方(不是 DB),然后它会检索该数据并将其存储在适当的位置(对象的 ArrayList)
  • 您认为数据库与非数据库的区别是什么?这是否意味着您不能让另一个进程(例如数据库服务器)独立于该程序运行?众多轻量级的进程内数据库之一呢?对于 java 来说,最简单的事情就是让你的数据结构可序列化,并使用 Java 的内置序列化将其写入文件。
  • 这正是我所需要的。但是数据序列化有点复杂,功能也不大。你能推荐其他的吗?
  • 一般来说,存储数据并不简单。 Java 的序列化是健壮的并且可以处理很多极端情况,但是如果您不对数据类做任何奇怪的事情,使用它可以像让每个数据类实现Serializable 接口并写入和读取文件一样简单使用ObjectOutputStreamObjectInputStream。如果您需要帮助,请展示您对代码的了解程度,并在遇到问题时提出具体问题。

标签: java file memory-management software-design


【解决方案1】:

下次用户重新编译项目时

用户不重新编译项目。他们只是运行您的应用程序。

你一直在说“不是 DB”,所以答案很简单:不可能

根据定义,数据库保存一些数据,因此得名:它是数据的基础。如果这不在桌面上,那么您就不走运了,并且您想要的东西是不可能的。

也许你的措辞也很粗心,你的意思也许是:

我不想强迫用户安装数据库

好吧,那就不要了。使用进程内数据库,例如h2。用户不知道涉及到一个基于 SQL 的数据库系统,他们所看到的只是一个文件出现。不会启动额外的进程。

我讨厌 SQL

好吧,那就不要了。有一些工具可以将整个对象结构转换为一个包 o 字节,然后您可以将其保存到文件中,例如 Jackson 可以将一个对象(如果需要,可以包含所有相关的用户数据)转换为 JSON数据,然后您可以将其保存到文件中,并在以后恢复。当然,如果有人在写入过程中绊倒了电源线,则文件已损坏。有一些方法可以解决这个问题(保存到.tmp,然后将其移动到位,因为这通常是原子的),但是由于您坚持不想要数据库,您有点致力于在这里重新发明轮子.

我只想保存整个系统状态

你不能。不是 java 的工作原理。

我不能零依赖吗?

有 java 的内置序列化系统,很糟糕,有一个关于如何使用它的警告列表,而且 java 平台本身的维护者或多或少不喜欢它。这不是要走的路。它也仍然不会“保存整个系统状态”,它只会保存一个对象,并且在这方面做得比例如杰克逊。

【讨论】:

  • 是的。通过数据库,我实际上是指 MySQL 或任何其他外部数据库系统。但是您建议的文件系统听起来很有趣。是否可以从这个“特定”文件中写入和读取对象,然后将它们加载到系统中?除了 Jackson,我还需要哪些外部库,你能推荐一下吗?
  • 'h2' 没有启动服务器,也没有二进制文件,它只是一个 jar。它最终制作了1个文件。您使用 SQL 向文件“写入”,并以相同的方式从中读取。除了 h2 之外,您不需要任何东西来使用它,有关更多信息,请参见 h2 的网站。 jackson 也是如此:Jackson 可以将对象转换为字符串,而核心 java 库将轻松地让您将其写入文件。请参阅 java.nio.file.Files 的 API 了解该部分。
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多