2

我想用 Java 保存一些数据,但我不想使用数据库(MySQL,...)。程序的属性将保存在一个文件中,每秒更新 500 次,并在程序执行时加载一次。该程序可能运行 5 小时或更长时间。这个程序的性能(速度)是突出的。


谢谢您的回答。我无法使用 RAM,因为如果我的 PC 意外关机(例如拔掉电源线)我会丢失我的信息。我保存/更新一个长变量,每秒 500/1024 次。

4

3 回答 3

0

也许考虑谷歌协议缓冲区来存储您的设置。显然,它们可以非常快速地解析/写入。但是,如果您想享受它的速度,它将不会以人类可读的格式存储。我不能从你的问题中得出结论,但是你想要那个。

基本上协议缓冲区将允许您定义要存储的内容,然后生成代码以实际保存/加载该数据。因为它以二进制形式写入,所以它比 XML 或典型的 java 属性文件要快。因此,如果性能真的很重要,您肯定应该考虑这一点。

于 2012-05-18T12:03:34.307 回答
0

我不确定性能的适用性(尽管我想它会很好),但 Java 有 java.util.prefs.Preferences 旨在执行这种存储。你至少应该考虑一下。

您还应该考虑 java.util.Properties,它也可以很容易地做到这一点,即使是 XML....

JDOM 本身(我维护,因此有一些偏见)将能够做到这一点,具体取决于文件的大小,您的硬件,以及您在输出数据时是否重新格式化数据(或使用更快/默认'原始'格式)。

真正的问题是“你的问题是什么?” ……

  • 可以吗?
  • 可以用 JDOM 完成吗?
  • 可以用 DOM 完成吗?
  • 用别的东西能做得更好吗?
  • 它可以在 Linux 上比 Windows 更快地完成吗(我想这是真的……)
  • 为什么要每秒保存 500 次呢?为什么不缓存它并加载一个关闭挂钩来保存?
于 2012-05-18T10:45:12.597 回答
0

这可能不是您想要的,但是您是否考虑过对象序列化?基本上,你有你的对象实施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();
}
于 2012-05-18T12:11:08.730 回答