从属性文件中解析映射

时间:2009-09-04 16:40:54

标签: java properties maps

这是我之前提出的问题的后续问题(找到here)。到目前为止,我的属性文件包含简单的键值对,如整数和字符串。我现在想用它来放置一些更高级的结构,更具体地说,我需要一个Map< A,Integer>其中A是我定义的类,例如:

foo=bar,5;baz,10

这可能吗?如果是这样,我应该如何格式化文件并分别解析地图?

是否有更好的方法可以解决这个问题?

4 个答案:

答案 0 :(得分:3)

您是否考虑过使用split()和trim()。

请参阅以下内容:

ResourceBundle rb = ResourceBundle.getBundle(Prop.class.getName());

    String fooValue = rb.getString("foo");
    String[] firstSplit = fooValue.split(";");
    for(String first : firstSplit){
        String firstTrim = first.trim();

        String[] intAndString = firstTrim.split(",");
        if(intAndString.length == 2){
            String intString = intAndString[0].trim();
            String stringVal = intAndString[1].trim();

            //TODO add entries here or return value.

        }
    }

答案 1 :(得分:1)

对于你正在尝试做的事情以及你的长期计划可能有点过分,但我发现Spring框架很容易处理这种事情。

以下是展示如何handle collections including maps的参考资料。

这是另一个general article on Spring

以下是Spring配置文件中的地图

<beans>
    <bean id="foo" class="x.y.Foo">
        <property name="accounts">
            <map>
                <entry key="one" value="9.99"/>
                <entry key="two" value="2.75"/>
                <entry key="six" value="3.99"/>
            </map>
        </property>
    </bean>
</beans>

答案 2 :(得分:1)

使用具有您自己语言的XML而不是属性文件来表示更复杂的结构,它将减少工作量,减少错误,更易于维护。

您可以使用JIBX和XML Bean等绑定技术来简化操作。

答案 3 :(得分:1)

在这个例子中最简单的方法是为它创建一个单独的属性文件。然后它只有名称/值对,如

巴= 5 巴兹= 10

如果这是一张大桌子,我不想把它与更常见的东西混在一起。如果它是一个有3对的表,那就不同了。

属性文件确实是复杂数据结构的最佳解决方案。它们用于名称/值对。如果你超越了这一点,当然,你可以通过发明一种语法使它工作,但为什么要这么麻烦?如果它是一种超级复杂的语法,那么XML是一种可能性。或者它可能属于关系数据库。或CSV文件。选择符合要求的工具,不要先决定工具,然后尝试使其适合。