我想在java中保存一些信息,但我不想使用Database(mysql,...)。 程序的属性将保存在文件中并每秒更新500次,并在程序执行时加载一次。该程序可能运行5小时或更长时间。该计划的表现(速度)非常突出。
坦克的答案。我不能使用RAM因为如果PC意外关闭(例如拔掉电源线)我丢失了我的信息。我保存/更新一个长变量,每秒500/1024次。
答案 0 :(得分:0)
我不确定性能的适用性(尽管我认为它会没问题),但是Java有java.util.prefs.Preferences,它是为了实现这种存储而设计的。你至少应该考虑它。
您还应该考虑java.util.Properties,它也可以轻松实现,即使是XML ....
JDOM本身(我维护,因此有一些偏见)将能够做到这一点,具体取决于文件的大小和硬件,以及在输出数据时是否重新格式化数据(或使用更快/默认'原始'格式)。
真正的问题是“你的问题是什么?” ....
答案 1 :(得分:0)
也许考虑google protocol buffer来存储您的设置。显然,它们可以非常快速地进行解析/编写。但是,如果您想要享受它的速度,它将不会以人类可读的格式存储。我无法从你的问题中得出结论,但是你想要那样。
基本上,协议缓冲区允许您定义要存储的内容,然后生成实际保存/加载该数据的代码。因为它以二进制形式写入,所以它比XML或典型的jave属性文件更快。因此,如果表现非常重要,那么你应该明确地考虑这一点。
答案 2 :(得分:0)
这可能不是您想要的,但您是否考虑过Object Serialization?基本上,您的对象是java.io.Serializable
,然后您可以将它们设为ObjectOutputStream
并说out.writeObject(yourObject)
。这非常容易。以下是Java Helper Library编写和阅读的示例方法。
/**
* Saves the given object to the given destination. The object and all it's variables must implement
* java.io.Serializable or the variables must have the keyword "transient" in front of it.
*
* @param object
* @param savePath
* @throws IOException
*/
public static void saveObject(Object object, String savePath) throws IOException {
FileOutputStream f_out = new FileOutputStream(savePath); //If you want the object to be saved in memory just create a ByteArrayOutputStream instead and return the bytes in this method.
ObjectOutputStream o_out = new ObjectOutputStream(f_out);
o_out.writeObject(object);
}
/**
* Opens an object from the given openPath and returns it
*
* @param openPath
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static Object loadObject(String openPath) throws IOException, ClassNotFoundException {
FileInputStream f_in = new FileInputStream(openPath); //If you want the object to be saved in memory just give the method a byte[] and create a ByteArrayInputStream instead.
ObjectInputStream o_in = new ObjectInputStream(f_in);
return o_in.readObject();
}