在java属性文件中表示数组的更好方法

yep*_*yep 48 java arrays enums properties

我目前正在创建一个需要加载并转换为数组的.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
Run Code Online (Sandbox Code Playgroud)

我将文件名/过期配对组装成一个数据对象,作为每个父属性元素的数组的一部分 foo[myobject]

属性文件的格式可以改变,我对想法持开放态度.

Abs*_*Abs 37

我可以建议使用分隔符并使用

String.split(delimiter)

示例属性文件:

MON = 0800#Something#Something1,Something2

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

希望有所帮助


Big*_*c66 13

定义不是潜在值的分隔符或学习使用XML.

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

  • Json是如此的笨蛋,使用Yaml! (10认同)
  • 我不同意.我同时使用JSON和XML.只要没有json方案的"真实"标准,我更喜欢XML用于复杂配置.当你作为一个团队开展工作时,你承担了基于它的维护和持续开发的负担,而不是正确的模式定义是无价的.没有任何限制意味着很多令人头疼的事情以及关于如何做事的讨论.或者更糟糕的是,没有讨论,任何人都会实现他们想要的任何符合他们需求的东西,你很快就会陷入配置状态.在其他人的自动完成配置文件也很好. (7认同)
  • 使用XML或处理痛苦 (5认同)
  • 上帝,我喜欢这个答案,但不幸的是,我们中的一些人被官僚主义和/或"管理限制"所困扰,这些限制要求使用.properties代替.xml.我不会描述我现在的位置,但是,你知道.(还有,死灵法术.) (2认同)

小智 12

没有完全明白你的意图.检查Apache Commons配置库http://commons.apache.org/configuration/

对于一个键,你可以有多个值,如key = value1,value2,你可以把它读成数组 configuration.getAsStringArray("key")


San*_*eth 6

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

关于 YAML 的快速浏览:

JSON 的超集,它可以做 JSON 可以做的一切 + 更多

  1. 简单易读
  2. 将长属性转换为多行值
  3. 支持评论
  4. 属性作为数组
  5. YAML 验证

  • 虽然我喜欢这个答案,但我必须感叹我上次检查时 java 没有内置的 YAML 处理。 (4认同)
  • 是的,但是如果使用 Spring Boot 应用程序,它已经包含了 YAML 处理器“Snakeyaml”依赖项。 (2认同)

小智 5

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

key.0=value0
key.1=value1
...
Run Code Online (Sandbox Code Playgroud)

自定义加载:

/** 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;
}
Run Code Online (Sandbox Code Playgroud)