-1

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

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

显而易见的想法是数据库,但是对于这么少的数据,增加对数据库的依赖似乎有点过头了。下一个想法是写入文件,但是如何处理缺少写入文件的权限、文件损坏或数据竞争/陈旧问题?持久化文件的简单/明显方法是否足够,或者它是否可能在现实世界中引起问题?

简而言之,有哪些有效但不太苛刻的方法可以可靠地持久保存数据,即使系统意外停机,它也能以很高的(即使不是完美的)可信度来工作?没有任何花哨的东西就可以轻松实现文件持久性吗?是否有任何有用的课程可以帮助解决这个问题?

4

3 回答 3

1

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

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

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

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

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

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

于 2013-10-12T19:45:46.553 回答
1

如果您想保存/保留对象,请查看 ObjectOutputStream 类。它是一种从对象中序列化/持久化数据的好方法。

但请注意:您想要“保存”的每个对象,都需要实现接口“Serializeable”才能与 ObjectOutputStream 一起使用。

这是一个很好的 Tut:http ://www.tutorialspoint.com/java/java_serialization.htm 这是来自 oracle 的文档:http: //docs.oracle.com/javase/1.4.2/docs/api/java /io/ObjectOutputStream.html

于 2013-10-12T19:54:07.910 回答
0

如果它是简单的键值信息,则属性文件可能就足够了。

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"));

这当然很容易。

于 2013-10-12T18:52:47.423 回答