我想用Java保存一些数据,但我不想使用数据库(MySQL,......).程序的属性将被保存在一个文件中,每秒更新500次,并在程序执行时加载一次。这个程序可能会运行5个小时以上.这个程序的性能(速度)很突出。
谢谢你的回答。我不能使用RAM,因为如果我的电脑意外关机(例如电源线拔掉),我就会丢失我的信息。我保存更新一个Long-variable,每秒钟5001024次。
也许可以考虑 谷歌协议缓冲区 来存储你的设置。显然,它们可以被解析写入非常快。但是,如果你想享受它的速度,它将不会以人类可读的格式存储。然而,我不能从你的问题中得出你想要的结论。
基本上协议缓冲区将允许你定义你想要存储的东西,然后生成代码来实际保存这些数据。因为它是以二进制写入的,所以比XML或典型的jave属性文件要快。所以,如果你对性能真的很关键,你应该考虑这个。
这可能不是你要找的,但你有没有考虑过 对象序列化? 基本上,你有你的对象内涵 java.io.Serializable
然后你可以把它们交给 ObjectOutputStream
并说 out.writeObject(yourObject)
. 这是超级简单的。下面是一个来自 Java助手库 用于写和读。
/**
* 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();
}
我不确定性能是否合适(尽管我想象它将会很好),但Java有java.util.prefs.Preferences,它被设计用来做这种存储。你至少应该考虑一下它。
你也应该考虑java.util.Properties,它也可以很容易地做到这一点,甚至作为XML......。
JDOM本身(我维护的,因此有一些偏见)将能够做到这一点,这取决于文件的大小,和你的硬件,以及你在输出数据时是否重新格式化(或使用更快的默认 "原始 "格式)。
真正的问题是 "你的问题是什么?" ....