基本Java应用程序数据存储

时间:2011-12-06 22:21:38

标签: java

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

  • 如何存储事件对象和其他数据? (.dat文件,某种类型的数据库等)
  • 它们应该存放在哪里?
  • 我猜测在程序启动时将所有对象加载到内存中是不好的,并且在程序关闭之前不在硬盘驱动器上更新它们。那我该怎么做呢?

如果有某种教程(或多篇教程)涵盖了我的问题的答案,那些链接将是完全可以接受的答案。

(我知道已经提出了一些类似的问题,但我找不到任何一个可以解决完整初学者观点的问题。)

编辑:就像我在其中一条评论中所说的那样,总的来说,我有兴趣用它作为一个学习如何以“正确”(合理可扩展,合理标准)的方式做事的机会,即使有一些更简单的解决方案适用于这种基本情况。

4 个答案:

答案 0 :(得分:3)

对于快速解决方案,如果您的数据结构(当然还有访问它们的方式)非常简单,可以使用您自己的格式(例如二进制,XML,...)读取和写入数据到文件中,或者也许标准格式如iCalendar可能更适合您的问题。 iCal4J等图书馆可能会帮助您。

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

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

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

如果您必须学习SQL,这可能意味着学习曲线,但它应该省去了处理定义自己的文件格式细节的麻烦。通过SQL(通常为其他开发人员所知)为您的数据提供结构可能比定义您自己的数据结构更好,无论如何您必须保存和读取自己的文件。

此外,如果您想直接处理对象,而不了解SQL,您可能会对Object-Relational Mapping框架感兴趣,例如Hibernate。他们的目的是通过直接存储/加载对象来隐藏SQL细节。不是每个人都喜欢它们,并且它们也有自己的学习曲线(这可能需要学习SQL如何工作的一些细节)。可以详细讨论它们的优缺点(在StackOverflow甚至是DBA.StackExchange上肯定存在这方面的问题。)

还有其他形式的数据库,例如XML数据库或Semantic-Web / RDF数据库,这些数据库可能适合您的需求,也可能不适合您。

答案 1 :(得分:1)

  

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

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

  

它们应该存放在哪里?

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

  

我猜测将所有对象加载到内存中并不好   程序启动,而不是在硬盘驱动器上更新它们,直到   程序结束。那我该怎么做呢?

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

答案 2 :(得分:1)

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

date|description|etc

这样,您可以将文件中的每一行作为记录读回,通过在分隔符(|)符号上拆分字符串来提取字段,然后使用数据。

将数据存储在与应用程序相同的文件夹中应该没问题。

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

答案 3 :(得分:0)

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

学习如何使用数据库是一个很大的主题,比我在论坛帖子中回答的要大。 (我可以建议你阅读我的书“数据库设计的Sane方法”,但在论坛上制作这样一个无耻的插件会很俗气!)

但是,基本上,您希望在需要时从数据库中读取数据,并在更改时更新数据。不要在启动时读取所有内容,并在关机时将其全部写回。

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