Java 可靠地保存*少量*数据的最佳方法?

Java 可靠地保存*少量*数据的最佳方法?,java,persistence,Java,Persistence,我有一个用java编写的系统,到目前为止,它不需要以前保存任何数据。我们现在有了一个新的需求,它似乎需要持久化数据,但在极少数情况下只需要少量数据 我正试图找到一种理想的方法来保存这些数据,并使用一种非常有效的方法(如果是99.9%,则不必100%)来确保我们不会丢失数据 一个显而易见的想法是一个数据库,但是对于如此少的数据来说,增加对数据库的依赖似乎过于致命了。下一个想法是写入文件,但如何处理缺少写入文件权限、文件损坏或数据竞争/过时问题?使用文件进行持久化的简单/显而易见的方法就足够了,还是

我有一个用java编写的系统,到目前为止,它不需要以前保存任何数据。我们现在有了一个新的需求,它似乎需要持久化数据,但在极少数情况下只需要少量数据

我正试图找到一种理想的方法来保存这些数据,并使用一种非常有效的方法(如果是99.9%,则不必100%)来确保我们不会丢失数据

一个显而易见的想法是一个数据库,但是对于如此少的数据来说,增加对数据库的依赖似乎过于致命了。下一个想法是写入文件,但如何处理缺少写入文件权限、文件损坏或数据竞争/过时问题?使用文件进行持久化的简单/显而易见的方法就足够了,还是可能在现实世界中引起问题


简言之,有哪些有效但不太苛刻的方法可以可靠地持久化数据,并且即使系统意外崩溃,也能保持高度(如果不是完美的话)的可信度?简单实现的文件持久性没有任何花哨的东西就足够了吗?有什么有用的类可以帮助实现这一点吗?

如果只是简单的键值信息,一个属性文件就足够了

Properties prop = new Properties();
prop.setProperty("key", "value");
//to save it:
prop.store(new FileOutputStream("filename.properties"), null);
//to load it:
prop.load(new FileInputStream("filename.properties"));

这当然很简单。

如果要持久化的数据是一个布尔标志,那么您可以创建或删除一个具有已知名称的文件作为布尔标志

如果要持久化的数据量足够小,则可以通过创建一个长度为零的文件(或目录)将数据作为文件名的一部分来持久化数据。从应用程序的角度来看,创建文件是一个原子操作。此方法的一个缺点是,您可能必须读取目录才能找到持久性文件,而不是访问具有已知名称的文件

如果您在具有符号链接的系统上使用Java 7,则可以创建符号链接,将要持久化的数据作为符号链接的目标。创建符号链接也是一种原子操作,创建指向不存在文件的符号链接不是错误

如果您决定以常规方式将持久性数据存储为文件内容,则写入文件的常规方式如下:

  • 打开一个新文件进行写入。在正确的目录中创建文件,但使用应用程序将忽略的临时名称
  • 将数据写入该文件,然后将其关闭。此时捕获任何错误,如果写入操作或关闭失败,则不要继续
  • 重命名文件,使其具有正确的名称

  • 此过程为您提供了一些保证,即只有在持久性文件的内容完整且正确时,才会以正确的名称存储持久性文件。如果要用新的持久性文件替换旧的持久性文件,请将其保留到步骤3。重命名操作将自动(在一个操作中)用新文件替换旧文件。

    如果要保存/持久化对象,请查看ObjectOutputStream类。这是一种从对象序列化/持久化数据的快速好方法

    但请注意:每个要“保存”的对象都需要实现“可序列化”接口,以便与ObjectOutputStream一起使用

    这是一个很好的图坦卡蒙:
    这是oracle的文档:

    您的问题是基于意见的,您的问题中有很大的猜测空间:数据有多重要?是否存在权限不足的风险?您希望如何处理数据损坏问题?(我们真的不能为你做决定,这不是我们的项目)。顺便说一句,当你要求“有助于这项工作的课程”时,我可以强烈推荐杰克逊图书馆。这会将您想要的任何POJO转换为JSON字符串。然后由您决定在何处存储该字符串。当然,如果您害怕手动数据操作,您可以考虑使用AES-128加密JSON数据。