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

bac*_*car 6 java configuration apache-commons-config

使用以下属性文件:

foo=hello, world!
bar=first,second
Run Code Online (Sandbox Code Playgroud)

我想将第一项检索为字符串,第二项检索为数组.我本以为getStringvs 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);
Run Code Online (Sandbox Code Playgroud)

Are*_*rff 4

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

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

通过 setListDelimiter() 使用不同的列表分隔符

只要您不需要将相同的值解释为字符串和数组,就可以使用。

属性文件:

foo=hello, world!
bar=first;second
Run Code Online (Sandbox Code Playgroud)

代码:

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

禁用分隔符解析并进行自己的分割

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

public static String[] gerStringArray(Configuration config, String key)
Run Code Online (Sandbox Code Playgroud)

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

使用两种不同的配置

一种用于设置数据,您知道数据的格式。您可以在此处激活分隔符解析。

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

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

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