在java中使用configuration2读取逗号分隔的属性

n s*_*ini 6 java comma

我有这个属性:

move.patternfile.include = *1a.txt,*2a.txt
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Apache commons configuration2将其放入列表中.

我的代码是:

Configurations configs = new Configurations();
AbstractConfiguration config = configs.properties(new File(fileName));
config.setListDelimiterHandler(new DefaultListDelimiterHandler(','));
Run Code Online (Sandbox Code Playgroud)

我可以阅读所有其他属性,但我想要的仍然是1个大小的列表.

这是检索值的命令:

List<String> linclude = configuration.getList(String.class, "patternfile.include");
Run Code Online (Sandbox Code Playgroud)

你能帮帮忙吗?

D.B*_*.B. 6

基于,似乎必须在从文件中读取属性之前设置分隔符.下面的代码在我运行它时起作用,但会生成警告.

Parameters params = new Parameters();
FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
     new FileBasedConfigurationBuilder<PropertiesConfiguration>(
             PropertiesConfiguration.class).configure(params.fileBased()
             .setListDelimiterHandler(new DefaultListDelimiterHandler(','))
             .setFile(new File("test.properties")));
PropertiesConfiguration config = builder.getConfiguration();

List<String> linclude = config.getList(String.class, "patternfile.include");

System.out.println(linclude.size());
for(String item: linclude){
    System.out.println(item);
}
Run Code Online (Sandbox Code Playgroud)

test.properties

patternfile.include =*1a.txt,*2a.txt

产量

2

*1a.txt

*2a.txt

这是我运行时看到的警告:

Jun 26, 2016 2:12:17 AM org.apache.commons.beanutils.FluentPropertyBeanIntrospector introspect
WARNING: Error when creating PropertyDescriptor for public final void org.apache.commons.configuration2.AbstractConfiguration.setProperty(java.lang.String,java.lang.Object)! Ignoring this property.
java.beans.IntrospectionException: bad write method arg count: public final void org.apache.commons.configuration2.AbstractConfiguration.setProperty(java.lang.String,java.lang.Object)
    at java.beans.PropertyDescriptor.findPropertyType(Unknown Source)
    at java.beans.PropertyDescriptor.setWriteMethod(Unknown Source)
    at java.beans.PropertyDescriptor.<init>(Unknown Source)
    at org.apache.commons.beanutils.FluentPropertyBeanIntrospector.createFluentPropertyDescritor(FluentPropertyBeanIntrospector.java:177)
    at org.apache.commons.beanutils.FluentPropertyBeanIntrospector.introspect(FluentPropertyBeanIntrospector.java:140)
    at org.apache.commons.beanutils.PropertyUtilsBean.fetchIntrospectionData(PropertyUtilsBean.java:2234)
    at org.apache.commons.beanutils.PropertyUtilsBean.getIntrospectionData(PropertyUtilsBean.java:2215)
    at org.apache.commons.beanutils.PropertyUtilsBean.getPropertyDescriptor(PropertyUtilsBean.java:950)
    at org.apache.commons.beanutils.PropertyUtilsBean.isWriteable(PropertyUtilsBean.java:1466)
    at org.apache.commons.configuration2.beanutils.BeanHelper.isPropertyWriteable(BeanHelper.java:521)
    at org.apache.commons.configuration2.beanutils.BeanHelper.initProperty(BeanHelper.java:357)
    at org.apache.commons.configuration2.beanutils.BeanHelper.initBeanProperties(BeanHelper.java:273)
    at org.apache.commons.configuration2.beanutils.BeanHelper.initBean(BeanHelper.java:192)
    at org.apache.commons.configuration2.beanutils.BeanHelper$BeanCreationContextImpl.initBean(BeanHelper.java:669)
    at org.apache.commons.configuration2.beanutils.DefaultBeanFactory.initBeanInstance(DefaultBeanFactory.java:162)
    at org.apache.commons.configuration2.beanutils.DefaultBeanFactory.createBean(DefaultBeanFactory.java:116)
    at org.apache.commons.configuration2.beanutils.BeanHelper.createBean(BeanHelper.java:459)
    at org.apache.commons.configuration2.beanutils.BeanHelper.createBean(BeanHelper.java:479)
    at org.apache.commons.configuration2.beanutils.BeanHelper.createBean(BeanHelper.java:492)
    at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.createResultInstance(BasicConfigurationBuilder.java:447)
    at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.createResult(BasicConfigurationBuilder.java:417)
    at org.apache.commons.configuration2.builder.BasicConfigurationBuilder.getConfiguration(BasicConfigurationBuilder.java:285)
    at main.Main.main(Main.java:25)
Run Code Online (Sandbox Code Playgroud)

我发现此链接有关此警告消息.

  • 我能够通过排除对 commons-beanutils:1.9.2 的传递依赖并添加对 commons-beanutils:1.9.4 的直接依赖来摆脱警告消息 (2认同)

Sky*_*ker 5

在 Apache Commons Configuration 中,有 PropertiesConfiguration。它支持以下功能converting delimited string to array/list.

例如,如果您有一个属性文件

#Foo.properties
foo=bar1, bar2, bar3
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties");
String[] values = config.getStringArray("foo");
Run Code Online (Sandbox Code Playgroud)

会给你一个字符串数组 ["bar1", "bar2", "bar3"]


getString只返回多值键的第一个值。尝试getStringArray获取这两个值。

完整代码示例:

ApacheCommonPropertyConfig.java

import java.util.List;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;

public class ApacheCommonPropertyConfig {

    public static void main(String[] args) throws ConfigurationException {
        PropertiesConfiguration config;
        try {
            config = new PropertiesConfiguration("F://foo.properties");
            // For Array
            String[] values = config.getStringArray("foo");
            for(String strVal : values) {
                System.out.println("Array Value is: "+strVal);
            }
            // For List
            List<Object> linclude =  config.getList("foo");
            for(Object str : linclude){
                System.out.println("List Value is: "+str.toString());
            }
            // For List Another
            List<Object> list = config.getList("listOfValue", config.getList("foo"));
            for(Object str : list){
                System.out.println("Another List Value is: "+str.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

foo.properties

foo=bar1, bar2, bar3
Run Code Online (Sandbox Code Playgroud)

输出:

Array Value is: bar1
Array Value is: bar2
Array Value is: bar3
List Value is: bar1
List Value is: bar2
List Value is: bar3
Another List Value is: bar1
Another List Value is: bar2
Another List Value is: bar3
Run Code Online (Sandbox Code Playgroud)

另一个使用 AbstractFileConfiguration 的例子

ListDelimiterDemo.java

import org.apache.commons.configuration.AbstractFileConfiguration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;


public class ListDelimiterDemo {

    public static void main(String[] args) throws ConfigurationException {
        AbstractFileConfiguration config = new PropertiesConfiguration();
        config.setListDelimiter(',');
        config.load("F://foo.properties");

        for (Object listItem : config.getList("foo")) {
            System.out.println(listItem);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

bar1
bar2
bar3
Run Code Online (Sandbox Code Playgroud)

资源链接:

  1. 从属性文件中读取列表并加载弹簧注释 @Value
  2. Class PropertiesConfiguration

  • 感谢您的回答和 +1 的努力,但问题是:如何使用 apache.commons.configuration2 而不是 apache.commons.configuration 实现这一点 (2认同)