我有一个用java编写的系统,到目前为止还不需要保留任何数据。我们现在有一个新的要求似乎需要持久的数据,但在极少数情况下只有少量。
我正在试图找出一种理想的方法来保持这些数据具有相当不错(如果它是99.9%,则不必100%)有效的方法来确保我们不会丢失数据。
显而易见的想法是数据库,但是对于如此少的数据,在数据库中添加依赖性似乎过度杀死。下一个想法是写入一个文件,但是如何处理缺少写入文件的权限,或文件被破坏,或datarace / staleness问题?简单/明显的问题是文件持久性是否足够或是否可能导致现实世界中的问题?
简而言之,即使系统出现意外故障,哪些有效但不是太严苛的方法可靠地保持数据具有很高的信心(如果不是完美的话),它将起作用?琐事实施文件持久性没有任何花哨的东西?是否有任何有用的课程可以帮助解决这个问题?
答案 0 :(得分:1)
如果要保留的数据是布尔标志,那么您可以创建或删除具有已知名称的文件作为布尔标志。
如果要保留的数据量足够小,那么您可以通过创建一个零长度文件(或目录)来保留它,并将数据作为文件名的一部分。从应用程序的角度来看,创建文件是一种原子操作。此方法的一个缺点是您可能必须读取目录才能找到持久性文件,而不是访问具有已知名称的文件。
如果您在具有符号链接的系统上使用Java 7,则可以创建符号链接,将要保留的数据作为符号链接的目标。创建符号链接也是一个原子操作,创建一个指向不存在的文件的符号链接并不是错误。
如果您决定以传统方式将持久性数据存储为文件内容,则写出文件的常用方法如下:
此过程可以确保持久性文件只有在其内容完整且正确的情况下才会以正确的名称存储。如果要使用新的持久性文件替换旧的持久性文件,请将其保留到第3步。重命名操作将以原子方式(在一个操作中)将旧文件替换为新文件。
答案 1 :(得分:1)
如果你想保存/持久化对象,请查看ObjectOutputStream类。它是一种从对象序列化/持久化数据的好方法。
但请注意:每个对象你想“保存”,需要实现与SerialOutputStream一起使用的“Serializeable”接口。
这是一个很好的Tut:http://www.tutorialspoint.com/java/java_serialization.htm 以下是来自oracle的文档:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/ObjectOutputStream.html
答案 2 :(得分: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"));
这当然很容易。