txt文件或JDOM或DOM或

时间:2012-05-18 06:24:16

标签: java dom jdom jaxp

我想在java中保存一些信息,但我不想使用Database(mysql,...)。 程序的属性将保存在文件中并每秒更新500次,并在程序执行时加载一次。该程序可能运行5小时或更长时间。该计划的表现(速度)非常突出。


坦克的答案。我不能使用RAM因为如果PC意外关闭(例如拔掉电源线)我丢失了我的信息。我保存/更新一个长变量,每秒500/1024次。

3 个答案:

答案 0 :(得分:0)

我不确定性能的适用性(尽管我认为它会没问题),但是Java有java.util.prefs.Preferences,它是为了实现这种存储而设计的。你至少应该考虑它。

您还应该考虑java.util.Properties,它也可以轻松实现,即使是XML ....

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

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

  • 可以吗?
  • 可以用JDOM完成吗?
  • 可以用DOM完成吗?
  • 用其他东西可以做得更好吗?
  • 可以在Linux上比Windows更快(我想象的是真的......)
  • 为什么一秒钟保存500次?为什么不缓存它并加载shutdown hook来保存?

答案 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();
}