我有一系列应用程序属性,它们都有不同的类型。
类型可以包括布尔值,日期,时间戳或字符串。
我需要能够为管理用户提供更改这些属性的能力,并让系统记住/将它们保存到文件中。
我正在寻找一种最佳实践方法来存储这些应用程序属性,并能够在更改时保留它们并在启动时加载它们。
答案 0 :(得分:4)
来自未来的消息:该链接已经死亡。
Java有专门为此目的而构建的工具 - Properties。 这是关于它的非常好的文章
https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
答案 1 :(得分:4)
由于您需要存储和读取不同类型的各种属性,如布尔值,整数等。我认为java.util.prefs
API对您来说是个不错的选择。它允许您存储和读取各种数据类型。
答案 2 :(得分:2)
java.util.Properties
是最简单的方法。可以从属性文件(包含格式为Properties
的属性的文件)甚至是简单的XML文件创建name=value
对象。您可以修改内存中的对象,然后将其写回属性或XML文件。
如果在构造属性时需要更大的灵活性,可以考虑设计自己的 XML配置文件,尽管读取和写入会有更多的工作量。但是,您可以使用编组/解组API(如JAXB,XStream等)来简化该任务。
这些文件也可以手动修改。
答案 3 :(得分:1)
假设您使用的是Java,请查看apache commons DatabaseConfiguration(http://commons.apache.org/configuration/apidocs/org/apache/commons/configuration/DatabaseConfiguration.html)。
基本上,它的功能非常简单。它扫描具有键值对的表,并将该表公开为java.util.Properties。您可以使用它从数据库加载应用程序属性
加载后,您可以在应用程序中缓存这些属性。每当您更改应用程序属性时,请记住使此缓存无效。
答案 4 :(得分:1)
我使用这段代码,它对我来说非常好(只有部分代码,从内存编码......): (这与java的Properties类一起使用,但它可以更容易地添加属性并使属性文件模板保持同步。)
to use:
Date date = Conf.value(Prop.SOME_DATE,Date.class);
和
enum Prop {
SOME_DATE(Date.class, "2009-10-28", "Some date"){
Object parse(String value){
return new Date(value);
}};
private final Class<?> type;
private final String description;
private final Object default;
Properties(Class<?> type, String defaultValue, String desc){
this.type = type;
this.description = desc;
this.default = this.parse(defaultValue);
}
abstract Object parse(String value);
}
和
class Conf {
private static final String PROP_FILE_NAME = "some.properties";
private volatile Map<Prop,Object> store;
public void load(){
//Read from property file and use default if not given.
//I code it in a way that it will not permit null as value, so
//if default is null the user is forced to provide setting.
}
public <T> T value(Prop prop, Class<T> clazz){
return (T)this.store.get(prop);
}
public static void main(String[] args){
//code to autogenerate property file
//Something like:
//#Default : 2009-10-28 Description : Some date. Type:Date
//#SOME_DATE=2009-10-28
}
}
class参数使得该方法有点冗长,但是如果你只能让java推断出类型,有时会很烦人,比如:
CountDownLatch latch = Conf.value(Prop.SOME_INTEGER);
//Compilation error! Since it expects int and won't unbox.
CountDownLatch latch = Conf.value(Prop.SOME_ITEGER,Integer.class);
//Verbose, but works everytime. Of course you could get a
//ClassCastException, but you should notice that early
//in the development...
答案 5 :(得分:0)
您可以将它们存储在数据库中,但是由于属性的数据类型不同,您必须将它们存储在String表示形式中。您可以使用另一列来指定数据类型。
这种形式的应用程序参数化是您在我的工作中成功使用的。这是一般的想法,我希望你能用这个来达到你的解决方案。
答案 6 :(得分:0)
您可以使用SQLite Firefox使用它来保存属性
答案 7 :(得分:0)
即使你应该使用Preferences API或Properties,这里也可以使用hack:
创建HashMap<String, Object>
并使用XMLEncoder / XMLDecoder进行保存/加载。大多数标准java类都可以像java bean一样序列化。您可以创建一个简单的包装类来获取各种属性,处理默认值等。这样您还可以存储嵌套的集合,这有时很方便。这很容易实现。