【问题标题】:How do I create persistent memory for a java program?如何为 java 程序创建持久内存?
【发布时间】:2020-05-15 04:30:45
【问题描述】:

我是编程初学者,所以我正在尝试通过项目来学习。我的最新项目是创建一个可从不同计算机访问的议程/日历(如家庭日历),这样妈妈或爸爸就可以发布他们的活动,每个人都可以看到每个人的计划。

对于可以存储家庭议程实例以便他们可以随时返回的程序,我认为需要某种数据库或服务器来存储他们的信息。我怎么能这样做?

如果我的问题含糊不清,我深表歉意。我对编程比较陌生,但我非常渴望继续学习。

【问题讨论】:

  • 对于初学者来说,最大的杀手之一就是当他们允许自己的野心战胜自己的能力并变得沮丧时。首先学习基础知识,不要尝试将构建世界一流的程序作为您的第一个项目.持久存储的最基本形式是平面文件。在输入/输出上阅读此tutorial。然后问问自己是否准备好了。先走,后跑。

标签: java memory storage


【解决方案1】:

您有多种选择。

最简单的是序列化。序列化获取一个对象并使用ObjectOutputStream 将其写入流。您可以使用 ObjectInputStream 将其读回。

这很简单,因为没有错误检查,它只是几行代码。

  FileOutputStream fos = new FileOutputStream("calendar.dat");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(yourCalendar);
  oos.close();

同样:

  FileInputStream fis = new FileInputStream("calendar.dat");
  ObjectInputStream ois = new ObjectInputStream(fis);
  YourCalendar yourCalendar = (YourCalendar)ois.readObject();
  ois.close();

yourCalendar 是包含整个日历和约会等的主对象。

由于您不需要处理大量信息,因此完全足够了。

现在,话虽如此,它也充满了危险。文件格式是不透明的(您不能只在编辑器中打开它并查看它)。它也可能非常脆弱。如果您更改正在序列化的底层类,您可能无法重新读取文件。还有潜在的安全隐患(可能与您的情况无关,但它们仍然存在)。

可以以复杂性为代价来减轻其中的大部分问题。

同样,您可以使用 JSON 或 XML 库之一将对象序列化为其中一种基于文本的格式。这些是人类可读的,并且比二进制格式对更改不太敏感。

当然,所有这些都是“全有或全无”。在这种情况下,您正在写出整个对象及其所有嵌入对象。这意味着您不能单独访问数据。您也不能使用第 3 方工具来访问数据(如 SQL 工具集)。但是,同样,您没有太多数据,因此拥有这种访问权限可能没什么大不了的。

您不希望在多用户场景中使用它,因为它不能增量更新(同样,全有或全无)。

但是,总而言之,为了启动和运行,为了简单的坚持和认识到它的局限性,它会为您完成工作,并让您在您努力工作的其他方面时选中项目中的此框它。从这个开始很容易,然后再做一个更健壮的持久性机制。

【讨论】:

    【解决方案2】:

    内存是volatile。要存储数据persistently,您需要将其写入filesdatabases

    由于是基于意见的问题,所以我提出我的意见。

    • 您可以从学习读写文件(文本和二进制文件)开始。 在写入和读取文件时,您需要决定以哪种格式存储 JSON、Yaml、XML 或逗号分隔或序列化对象并将它们存储到文件中。选择权在你。

    在阅读时,您需要编写自己的逻辑来搜索它们。因此,虽然文件是存储数据的好方法,但您需要编写自己的搜索机制或使用 Elastic 搜索等文档搜索。

    • 另一种选择是使用提供 SQL 功能的数据库(如果使用关系数据库)来搜索您的数据库。为了使用数据库,您应该了解数据库、读取和写入数据库以及在 java 中建立与数据库的连接。

    在我看来

    您应该从数据库方法开始,因为您可以轻松地查询日期以获取给定日期出现的所有事件。因为,您不仅想存储事件,还想去一个特定的日期并列出该日期计划的事件。因此,您需要以易于搜索和阅读的方式存储数据。

    另外,我建议您使用 Spring 框架和 Maven,它们可以以最少的配置处理所有依赖项和数据库连接。 您可以使用h2 database,它是SQLite 版本,易于使用。使用基于文件的数据库,你现在不需要使用服务器。

    编辑

    也正如@springe 所建议的那样,您可以使用任何像 Hibernate 这样的 ORM 来处理数据库,这是一种安全且推荐的方式,即使在工业代码中也可以使用。基本上,在执行 CRUD 操作时使用 JPA/Hibernate 是一种很好的做法。

    但是,由于您是编程和其他方面的新手,因此请掌握简单的 SQL 并学习使用 ORM 等良好实践。

    供参考

    您可以参考Baeldung 获取参考,只需谷歌如何在java Bealdung 中执行此操作,您将获得非常酷且简短的操作指南。

    您将获得连接到 h2database 的 spring 配置、Spring 的 maven 依赖项以及 Baeldung 的数据库。一切都是标准的,您只需要复制粘贴,同时了解其工作原理。

    继续学习,我喜欢你的精神。 :)

    【讨论】:

    • 我完全同意这一点,但我想补充一点,我强烈推荐 JPA / Hibernate 持久性。一旦您了解 SQL / 数据库的工作原理,JPA 层将为您节省大量时间和必须为基本的创建、读取、更新和删除“CRUD”操作编写的代码。此外,它使您能够轻松更改底层数据库。
    • 是的,确实如此。一旦你将数据库与 Spring 一起使用,spring 会为你提供 JdbcTemplate,然后你可以使用 JPA/Hibernate 以及普通的 SQL 语句。它可以节省时间并防止 SQL 注入攻击。这取决于程序员是否对 ORM 或旧的普通 SQL 风格感到满意。
    • 我正在使用 JavaFX 作为用户界面。所以我需要存储用户放在日历上的信息,而不是日历界面本身?换句话说,我只存储用户输入的事件,当他们重新登录程序时,会在日历上显示这些事件?非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2011-05-28
    • 2015-12-20
    • 2011-04-06
    • 2021-01-26
    相关资源
    最近更新 更多