我可以在Apache Commons Config中同时使用数组和非数组吗?

时间:2012-08-15 17:05:58

标签: java configuration apache-commons-config

使用以下属性文件:

foo=hello, world!
bar=first,second

我想将第一项检索为字符串,第二项检索为数组。我原以为getString vs getStringArray会处理这个问题,但它没有 - getString("foo")只是在逗号之前得到所有内容,即“你好”。

如果我使用setDelimiterParsingDisabled禁用分隔符解析,则foo很好,但这也会改变getStringArray("bar")的行为以返回单元素数组!

我无法找到如何明确告诉它我希望它如何解释单个配置项,无论是字符串还是数组。我不想将配置项放入具有不同分隔符规则的单独配置文件中,我更喜欢使用逗号作为getStringArray案例的分隔符。

详细说明,此代码段打印hello - 2hello, world! - 1 - 我希望它打印hello, world! - 2

AbstractFileConfiguration config = new PropertiesConfiguration();
config.setFileName("C:\\temp\\temp.properties");
//config.setDelimiterParsingDisabled(true);
config.load();
System.out.println(config.getString("foo") + " - " + config.getStringArray("bar").length);

2 个答案:

答案 0 :(得分:4)

正如您所发现的,Commons Config缺少类似getPlainString()方法的东西。以下是一些解决方法的建议。

我认为使用不同的列表分隔符是最容易实现的。如果您需要更复杂的东西,请考虑另外两个:

对setListDelimiter()

使用不同的列表分隔符

只要您不需要解释与String和数组相同的值,就可以正常工作。

属性文件:

foo=hello, world!
bar=first;second

代码:

AbstractFileConfiguration config = new PropertiesConfiguration();
config.setFileName("C:\\temp\\temp.properties");
config.setListDelimiter(';');
config.load();
System.out.println(config.getString("foo") + " - " + config.getStringArray("bar").length);

禁用分隔符解析并执行自己的拆分

使用String.split()轻松完成。一个简单的静态方法可以:

public static String[] gerStringArray(Configuration config, String key)

或者创建PropertiesConfiguration的子类并覆盖getStringArray()getList()方法。

使用两种不同的配置

一个用于设置数据,您可以在其中了解数据的格式。在这里,您可以激活分隔符解析。

其中一个用于文本数据,您可能拥有任意数据。在这里,您应该停用分隔符解析。

这具有分离设置和文本数据的额外优势。

  • 不混合设置和文本数据可使两种配置更清晰。特别是如果两者兼而有之。
  • 根据部署环境(实时/测试),设置数据通常会发生变化,而文本数据会根据区域设置(en_GB / de_DE)而变化。

答案 1 :(得分:0)

在属性文件中,您可以执行以下操作:

urls=localhost
urls=127.0.0.1

在Java中,您可以获得列表:

String[] urls = Configure.settings().getStringArray("urls");
for(String url : urls)
    System.out.println(url);