问与答 在Java属性fi中表示数组的更好方法

bain · 2020-02-22 15:00:04 · 热度: 19

我目前正在制作一个.properties文件,该文件需要加载并转换为数组。 但是每个属性键的存在范围可能是0-25。 我尝试了一些实现,但我只是坚持这样做。 有人有想法么?

foo.1.filename=foo.txt
foo.1.expire=200

foo.2.filename=foo2.txt
foo.2.expire=10

etc more foo's

bar.1.filename=bar.txt
bar.1.expire=100

在这里,我将文件名/过期对组合为数据对象,作为每个父属性元素(如foo[myobject])的数组的一部分

属性文件的格式可以更改,我愿意接受。

猜你喜欢:
共收到 8 条回复
rod #1 · 2020-02-22 15:00:05

我可以建议使用定界符并使用

String.split(delimiter)

示例属性文件:

MON = 0800#Something#Something1,某物2

prop.load(new FileInputStream("\\\\Myseccretnetwork\\Project\\props.properties"));
String[]values = prop.get("MON").toString().split("#");

希望能有所帮助

jonathon #2 · 2020-02-22 15:00:06

定义一个不会成为潜在值的定界符,或者学习使用XML。

如果您仍然坚持使用属性,请使用一种将返回所有键列表的方法。 您的密钥似乎由三部分组成,即组标识符(foo,bar),索引(1、2),然后是元素名称(文件名,expire)。 获取所有按键,将它们分解为它们的组成部分。 为每种类型的标识符创建一个列表,在处理列表时,使用标识符来确定要添加到哪个列表。 按照您的说明创建配对的元素,然后将其添加到列表中即可! 如果索引顺序很重要,则可以将其作为字段添加到配对的元素中,或者在处理之前对键进行排序。

fred #3 · 2020-02-22 15:00:07

并非完全符合您的意图。请检查Apache Commons配置库[http://commons.apache.org/configuration/]

您可以针对一个键具有多个值,例如键=值1,值2您可以将其读取为configuration.getAsStringArray("key")

teikari #4 · 2020-02-22 15:00:08

我强烈建议使用Apache Commons([http://commons.apache.org/configuration/)。]它具有将XML文件用作配置文件的功能。 使用XML结构可以轻松地将数组表示为值列表,而不是经过特殊编号的属性。

seth #5 · 2020-02-22 15:00:09

我有自定义加载。 属性必须定义为:

key.0=value0
key.1=value1
...

自定义加载:

/** Return array from properties file. Array must be defined as "key.0=value0", "key.1=value1", ... */
public List<String> getSystemStringProperties(String key) {

    // result list
    List<String> result = new LinkedList<>();

    // defining variable for assignment in loop condition part
    String value;

    // next value loading defined in condition part
    for(int i = 0; (value = YOUR_PROPERTY_OBJECT.getProperty(key + "." + i)) != null; i++) {
        result.add(value);
    }

    // return
    return result;
}
enrique #6 · 2020-02-22 15:00:10

将YAML文件用作属性,这支持将属性作为数组。

快速浏览YAML:

JSON的超集,它可以完成JSON可以做的所有工作

  1. 易于阅读
  2. 长属性转换为多行值
  3. 支持评论
  4. 属性为数组
  5. YAML验证
maximus #7 · 2020-02-22 15:00:11

这是通过自己实现机制的另一种方法。这里我们认为数组应该以0开头,并且在索引之间没有空洞

    /**
     * get a string property's value
     * @param propKey property key
     * @param defaultValue default value if the property is not found
     * @return value
     */
    public static String getSystemStringProperty(String propKey,
            String defaultValue) {
        String strProp = System.getProperty(propKey);
        if (strProp == null) {
            strProp = defaultValue;
        }
        return strProp;
    }

    /**
     * internal recursive method to get string properties (array)
     * @param curResult current result
     * @param paramName property key prefix
     * @param i current indice
     * @return array of property's values
     */
    private static List<String> getSystemStringProperties(List<String> curResult, String paramName, int i) {
        String paramIValue = getSystemStringProperty(paramName + "." + String.valueOf(i), null);
        if (paramIValue == null) {
            return curResult;
        }
        curResult.add(paramIValue);
        return getSystemStringProperties(curResult, paramName, i+1);
    }

    /**
     * get the values from a property key prefix
     * @param paramName property key prefix
     * @return string array of values
     */
    public static String[] getSystemStringProperties(
            String paramName) {
        List<String> stringProperties = getSystemStringProperties(new ArrayList<String>(), paramName, 0);
        return stringProperties.toArray(new String[stringProperties.size()]);
    }

这是一种测试方法:

    @Test
    public void should_be_able_to_get_array_of_properties() {
        System.setProperty("my.parameter.0", "ooO");
        System.setProperty("my.parameter.1", "oO");
        System.setProperty("my.parameter.2", "boo");
        // WHEN 
        String[] pluginParams = PropertiesHelper.getSystemStringProperties("my.parameter");

        // THEN
        assertThat(pluginParams).isNotNull();
        assertThat(pluginParams).containsExactly("ooO","oO","boo");
        System.out.println(pluginParams[0].toString());
    }

希望这可以帮助

并欢迎所有评论。

ramiro #8 · 2020-02-22 15:00:12

正如用户“跳过头”已经指出的那样,csv或任何表文件格式在您的情况下都是更好的选择。

如果您可以选择使用此表,也许您对此表感兴趣。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册