基本Java应用程序数据存储

基本Java应用程序数据存储,java,Java,我正在(本质上)开发一个用Java编写的日历应用程序,我需要一种存储日历事件的方法。这是我写的第一个“真正的”应用程序,而不是简单的项目(通常用于类),它们要么不在程序会话之间存储信息,要么将其作为文本或.dat文件存储在与程序相同的目录中,因此我有一些关于数据存储的基本问题 事件对象和其他数据应如何存储?(.dat文件、某种类型的数据库等) 它们应该存放在哪里 我猜在程序启动时将所有对象加载到内存中,并且在程序关闭之前不在硬盘上更新它们是不好的。那我该怎么办呢 如果有一些教程(或多个教程)

我正在(本质上)开发一个用Java编写的日历应用程序,我需要一种存储日历事件的方法。这是我写的第一个“真正的”应用程序,而不是简单的项目(通常用于类),它们要么不在程序会话之间存储信息,要么将其作为文本或.dat文件存储在与程序相同的目录中,因此我有一些关于数据存储的基本问题

  • 事件对象和其他数据应如何存储?(.dat文件、某种类型的数据库等)
  • 它们应该存放在哪里
  • 我猜在程序启动时将所有对象加载到内存中,并且在程序关闭之前不在硬盘上更新它们是不好的。那我该怎么办呢
如果有一些教程(或多个教程)涵盖了我的问题的答案,那么这些链接将是完全可以接受的答案

(我知道已经提出了一些类似的问题,但我找不到一个完整的初学者视角。)

编辑:正如我在其中一条评论中所说的,总的来说,我很想把它作为一个学习如何以“正确”(合理的可扩展性,合理的标准)的方式做事的机会,即使在这种基本情况下有更简单的解决方案

事件对象和其他数据应如何存储?(.dat文件, 某种类型的数据库等)

这取决于要存储(和加载)的数据的大小,以及您是否希望能够对数据执行查询

它们应该存放在哪里

用户目录(或用户目录的子目录)中的文件是一个不错的选择。使用
System.getProperty(“user.home”)
获取它

我猜当你需要的时候,把所有的对象都加载到内存中是不好的 程序将启动,直到 节目结束。那我该怎么办呢


这可能是一件非常有效的事情,除非数据量太大,会占用太多内存。我认为对于一个简单的日历应用程序来说,这不会是一个问题。如果您不想这样做,则将事件存储在数据库中,并执行查询以仅加载必须显示的事件。

一个简单的顺序文件就足够了。基本上,文件中的每一行代表一条记录,或者在您的情况下代表一个事件。使用字段分隔符分隔记录中的每个字段,类似管道(
|
)的符号效果很好。请记住以相同的格式存储每条记录,例如:

date|description|etc
通过这种方式,您可以将文件中的每一行作为记录读回,通过拆分分隔符(
|
)符号上的字符串来提取字段,并使用数据

将数据存储在与应用程序相同的文件夹中应该可以


我发现处理对象的最好方法(在大多数情况下)是确定存储的数据量是否足够大,从而对用户的内存产生影响。根据您的描述,在本程序中应该没有问题。

正确答案取决于详细信息,但您可能希望将事件写入数据库。有几个很好的免费数据库,比如MySQL和Postgres,所以你可以(相对)轻松地抓到一个并使用它

学习如何使用好数据库是一个很大的课题,比我将在论坛帖子中回答的问题还要大。(我可以建议您阅读我的书《数据库设计的理性方法》,但在论坛上制作这样一个无耻的插件是很俗气的!)

不过,基本上,您希望在需要时从数据库中读取数据,并在数据发生变化时进行更新。不要在启动时阅读所有内容,在关闭时将其全部写回


如果数据量很小且很少更改,则将其全部保存在内存中并将其写入平面文件会更简单、更快。但是大多数应用程序都不符合这种描述。

如果您的数据结构(当然还有访问它们的方式)足够简单,可以使用您自己的格式(如二进制、XML等)或更适合您的问题的标准格式,将数据读写到文件中。像这样的库可能会在这方面帮助您

考虑到问题的更一般方面,这是一个更广泛的主题,但您可能希望阅读有关数据库(关系型或非关系型)的内容。您是否想使用它们将取决于应用程序的总体复杂性

许多关系数据库可以在Java中使用。这应该允许您连接到您选择的关系数据库()。其中一些可以在自己的服务器应用程序中运行(例如MS SQL、Oracle、MySQL、PostgreSQL),但其中一些可以嵌入Java应用程序中,例如:(Apache Derby DB的变体)或SQLite

这些可嵌入的SQL数据库基本上将数据存储在运行应用程序的同一台计算机上的文件上(以特定于它们的格式),但允许您使用SQL查询来使用数据。 好处包括数据的特定结构(在设计表和可能的约束时构建),以及(在引擎支持时)通过处理并发访问的能力。即使在桌面应用程序中,这也可能很有用

如果您必须学习SQL,这可能意味着需要学习曲线,但它应该可以避免您在处理定义自己的文件格式的细节时遇到的麻烦。通过SQL(通常为其他开发人员所知)为数据提供结构要比定义自己的数据结构好得多,而这些数据结构无论如何都必须保存到自己的文件中并从中读取

此外,如果您想直接处理对象,而不太了解SQL,那么您可能会对以下框架感兴趣,例如。他们的目标是通过能够直接存储/加载对象来隐藏SQL细节