我想用 Java 保存一些数据,但我不想使用数据库(MySQL,...)。程序的属性将保存在一个文件中,每秒更新 500 次,并在程序执行时加载一次。该程序可能运行 5 小时或更长时间。这个程序的性能(速度)是突出的。
谢谢您的回答。我无法使用 RAM,因为如果我的 PC 意外关机(例如拔掉电源线)我会丢失我的信息。我保存/更新一个长变量,每秒 500/1024 次。
也许考虑谷歌协议缓冲区来存储您的设置。显然,它们可以非常快速地解析/写入。但是,如果您想享受它的速度,它将不会以人类可读的格式存储。我不能从你的问题中得出结论,但是你想要那个。
基本上协议缓冲区将允许您定义要存储的内容,然后生成代码以实际保存/加载该数据。因为它以二进制形式写入,所以它比 XML 或典型的 java 属性文件要快。因此,如果性能真的很重要,您肯定应该考虑这一点。
我不确定性能的适用性(尽管我想它会很好),但 Java 有 java.util.prefs.Preferences 旨在执行这种存储。你至少应该考虑一下。
您还应该考虑 java.util.Properties,它也可以很容易地做到这一点,即使是 XML....
JDOM 本身(我维护,因此有一些偏见)将能够做到这一点,具体取决于文件的大小,您的硬件,以及您在输出数据时是否重新格式化数据(或使用更快/默认'原始'格式)。
真正的问题是“你的问题是什么?” ……
这可能不是您想要的,但是您是否考虑过对象序列化?基本上,你有你的对象实施java.io.Serializable
,然后你可以把它们交给 anObjectOutputStream
和 say 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();
}