Java 我可以在Apache Commons配置中同时使用阵列和非阵列吗?

Java 我可以在Apache Commons配置中同时使用阵列和非阵列吗?,java,configuration,apache-commons-config,Java,Configuration,Apache Commons Config,使用以下属性文件: foo=hello, world! bar=first,second foo=hello, world! bar=first;second 我想将第一项作为字符串检索,第二项作为数组检索。我本以为getStringvsgetStringArray会处理这个问题,但它不会-getString(“foo”)只获取逗号之前的所有内容,即“hello” 如果我使用setDelimiterParsingDisabled禁用分隔符解析,那么foo是可以的,但这也会改变getStrin

使用以下属性文件:

foo=hello, world!
bar=first,second
foo=hello, world!
bar=first;second
我想将第一项作为字符串检索,第二项作为数组检索。我本以为
getString
vs
getStringArray
会处理这个问题,但它不会-
getString(“foo”)
只获取逗号之前的所有内容,即“hello”

如果我使用
setDelimiterParsingDisabled
禁用分隔符解析,那么foo是可以的,但这也会改变
getStringArray(“bar”)
返回单个元素数组的行为

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

更详细地说,这段代码要么打印
hello-2
要么打印
hello,world!-1
-我想让它打印出来你好,世界!-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);

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

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

对setListDelimiter()使用不同的列表分隔符 只要不需要将相同的值解释为字符串和数组,就可以工作

属性文件:

foo=hello, world!
bar=first,second
foo=hello, world!
bar=first;second
代码:

禁用分隔符解析并执行您自己的拆分 很容易完成。一个简单的静态方法可以:

public static String[] gerStringArray(Configuration config, String key)
或者创建
PropertiesConfiguration
的子类,并重写
getStringArray()
getList()
方法

使用两种不同的配置 一个用于设置数据,您知道数据的格式。在这里,您可以激活分隔符解析

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

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

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

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

urls=localhost
urls=127.0.0.1
在Java中,您可以获得以下列表:

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

这就是我最后所做的,但这是一个非常令人失望的解决方案。如果
foo
是一个任意的句子,我无法预测其中会出现什么标点符号或字符(例如国际化消息)?@bacar很好。处理未知标点符号时,请注意常见配置的错误。这里还有相应的commons配置问题:[修复你的链接-。我在询问之后不久就对此发表了评论,所以。。。