2009-09-04 88 views
3

这是我之前的问题的后续行动(找到了here)。到目前为止,我的属性文件由简单的键值对组成,如int和Strings。我现在想用它来放置一些更高级的结构在里面,更具体,我需要一个Map < A,整数>其中A是我定义的类,例如像这样:从属性文件解析映射

foo=bar,5;baz,10 

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

有没有更好的方法来解决这个问题?

回答

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. 

     } 
    } 
+0

如果您的字符串需要包含逗号或分号,该怎么办? – Tom 2009-09-04 17:34:28

+0

我确定这不会是一个问题。另外,它总是可以交换给其他角色。 – 2009-09-04 17:37:08

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> 
1

使用XML而不是属性用自己的语言来表示更复杂的结构文件中,这将是较少的工作,少车,更容易维护。

您可以使用绑定技术(如JIBX和XML Beans)使事情更轻松。

1

在这个例子中最简单的事情就是为它创建一个单独的属性文件。然后,它只是名称/值对,就像

栏= 5 巴兹= 10

如果这是一个很大的表,我不想把它与更普遍的东西混合。如果它是一个3对的桌子,那就不一样了。

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

+0

我实际上最终使用了独立的属性文件和Koekiebox解决方案的组合。我通过使用读取字符串解析并映射它来创建类的实例。我对这个解决方案非常满意,因为它到目前为止效果很好,更不用说它的可读性了。 – 2009-09-04 17:59:43