【问题标题】:How do I specify values in a properties file so they can be retrieved using ResourceBundle#getStringArray?如何在属性文件中指定值,以便可以使用 ResourceBundle#getStringArray 检索它们?
【发布时间】:2010-09-18 13:41:03
【问题描述】:

我正在尝试使用ResourceBundle#getStringArray 从属性文件中检索String[]。文档中对该方法的描述如下:

从此资源包或其父资源包中获取给定键的字符串数组。

但是,我尝试将属性文件中的值存储为多个单独的键/值对:

key=value1
key=value2
key=value3

并以逗号分隔的列表:

key=value1,value2,value3

但这些都不能使用ResourceBundle#getStringArray 检索。

如何在属性文件中表示一组键/值对,以便可以使用ResourceBundle#getStringArray 检索它们?

【问题讨论】:

    标签: java resourcebundle


    【解决方案1】:

    Properties 对象可以容纳 Objects,而不仅仅是 Strings。这往往会被遗忘,因为它们压倒性地用于加载 .properties 文件,因此通常只包含Strings。 The documentation 表示调用bundle.getStringArray(key) 等价于调用(String[]) bundle.getObject(key)。这就是问题所在:值不是String[],而是String

    我建议以逗号分隔的格式存储它并在值上调用split()

    【讨论】:

    • 谢谢,您提供的答案是我所怀疑的。我已经使用 split() 实现了一些东西,我只是希望我可以利用类库中已经存在的东西,而不是自己滚动。
    • 感谢您的回答!我使用了一个简单的拆分来获取逗号后使用的间距(为了便于阅读)。我不得不使用更复杂的拆分,例如:stackoverflow.com/questions/1396084/…
    【解决方案2】:
    key=value1;value2;value3
    
    String[] toArray = rs.getString("key").split(";");
    

    【讨论】:

      【解决方案3】:

      只使用弹簧 - Spring .properties file: get element as an Array

      相关代码:

      base.module.elementToSearch=1,2,3,4,5,6
      
      @Value("${base.module.elementToSearch}")
        private String[] elementToSearch;
      

      【讨论】:

        【解决方案4】:

        我已经尝试过了,并且可以找到一种方法。 一种方法是定义 ListresourceBundle 的子类,然后定义 String[] 类型的实例变量 并将值分配给键..这是代码

        @Override
        protected Object[][] getContents() {
            // TODO Auto-generated method stub
        
            String[] str1 = {"L1","L2"};
        
            return new Object[][]{
        
                    {"name",str1},
                    {"country","UK"}                
            };
        }
        

        【讨论】:

          【解决方案5】:

          您可以使用Commons Configuration,它有方法getListgetStringArray,允许您检索逗号分隔的字符串列表。

          【讨论】:

          • @JG:谢谢,我会在下一个项目中考虑 Commons Configuration。我喜欢它在多行上支持key : value1key : value2key : value3 以及逗号分隔的列表(以及在值中转义逗号的能力,这是我自己的版本不支持的)。
          • 这是否仅适用于属性文件,或者这也适用于 Java“-D”命令行属性参数?
          【解决方案6】:

          示例:

          mail.ccEmailAddresses=he@anyserver.at, she@anotherserver.at
          

          ..

          myBundle=PropertyResourceBundle.getBundle("mailTemplates/bundle-name", _locale);
          

          ..

          public List<String> getCcEmailAddresses() 
          {
              List<String> ccEmailAddresses=new ArrayList<String>();
              if(this.myBundle.containsKey("mail.ccEmailAddresses"))
              {
                  ccEmailAddresses.addAll(Arrays.asList(this.template.getString("mail.ccEmailAddresses").split("\\s*(,|\\s)\\s*")));// 1)Zero or more whitespaces (\\s*) 2) comma, or whitespace (,|\\s) 3) Zero or more whitespaces (\\s*)
              }       
              return ccEmailAddresses;
          }
          

          【讨论】:

            【解决方案7】:
            public String[] getPropertyStringArray(PropertyResourceBundle bundle, String keyPrefix) {
                String[] result;
                Enumeration<String> keys = bundle.getKeys();
                ArrayList<String> temp = new ArrayList<String>();
            
                for (Enumeration<String> e = keys; keys.hasMoreElements();) {
                    String key = e.nextElement();
                    if (key.startsWith(keyPrefix)) {
                        temp.add(key);
                    }
                }
                result = new String[temp.size()];
            
                for (int i = 0; i < temp.size(); i++) {
                    result[i] = bundle.getString(temp.get(i));
                }
            
                return result;
            }
            

            【讨论】:

              【解决方案8】:

              我不相信从属性文件加载 ResourceBundles 是不可能的。 PropertyResourceBundle 利用 Properties 类来加载属性文件。 Properties 类将属性文件加载为一组 String->String 映射条目,并且不支持提取 String[] 值。

              调用 ResourceBundle.getStringArray 只是调用 ResourceBundle.getObject,将结果转换为 String[]。由于 PropertyResourceBundle 只是将它交给它从文件加载的 Properties 实例,因此您永远无法让它与当前的库存 PropertyResourceBundle 一起工作。

              【讨论】:

                【解决方案9】:

                嗯,看起来这是一个常见问题,来自线程 herehere

                看来要么您不使用该方法并自己解析数组的值,要么您编写自己的 ResourceBundle 实现并自己做:(。也许有一个 apache commons 项目用于此...

                从JDK源码看,PropertyResourceBundle似乎不支持。

                【讨论】:

                • 我也做了一些谷歌搜索,但似乎没有一个答案明确指出 PropertyResourceBundle 不支持这一点。我想我看到了一个 apache commons 项目,它提供了一个 getStringArray() 方法来处理 key=value1,value2,value3,但我只会自己动手。谢谢。
                猜你喜欢
                • 1970-01-01
                • 2013-10-28
                • 1970-01-01
                • 1970-01-01
                • 2017-04-06
                • 1970-01-01
                • 2011-03-19
                • 2021-11-23
                相关资源
                最近更新 更多