代码之家  ›  专栏  ›  技术社区  ›  Grant Wagner

如何在属性文件中指定值,以便使用ResourceBundle GetStringArray检索这些值?

  •  29
  • Grant Wagner  · 技术社区  · 16 年前

    我想用 ResourceBundle#getStringArray 检索一个 String[] 从属性文件。文档中对此方法的描述如下:

    从该资源束或其父项之一获取给定键的字符串数组。

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

    key=value1
    key=value2
    key=value3
    

    以逗号分隔的列表形式:

    key=value1,value2,value3
    

    但这两种方法都不能用 资源束GetStringArray .

    如何在属性文件中表示一组键/值对,以便使用 资源束GetStringArray ?

    9 回复  |  直到 16 年前
        1
  •  32
  •   josliber Martin Ballet    7 年前

    Properties 对象可以保存 Object S 不仅仅是 String 这往往会被遗忘,因为它们绝大多数用于加载.properties文件,因此通常只包含 S. The documentation 指示调用 bundle.getStringArray(key) 等于调用 (String[]) bundle.getObject(key) . 问题是:价值不是 String[] 这是一个 .

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

        2
  •  7
  •   naXa stands with Ukraine    10 年前

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

        3
  •  4
  •   Chris Kimpton    16 年前

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

    似乎您没有自己使用该方法并解析数组的值,或者编写自己的ResourceBundle实现并自己执行:()。也许有一个阿帕奇公共资源项目…

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

        4
  •  2
  •   Murlo    12 年前

    例子:

    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;
    }
    
        5
  •  1
  •   Alan Krueger    16 年前

    我认为从属性文件加载ResourceBundles时,这是不可能的。PropertyResourceBundle利用Properties类加载属性文件。properties类将一个属性文件作为一组字符串加载->字符串映射项,不支持拉出字符串[]值。

    调用ResourceBundle.GetStringArray只调用ResourceBundle.GetObject,将结果强制转换为字符串[]。由于propertyresourcebundle只将其传递给它从文件加载的属性实例,因此您将永远无法使其与当前的stock propertyresourcebundle一起使用。

        6
  •  1
  •   Community CDub    7 年前

    用弹簧就行了- Spring .properties file: get element as an Array

    相关代码:

    base.module.elementToSearch=1,2,3,4,5,6
    
    @Value("${base.module.elementToSearch}")
      private String[] elementToSearch;
    
        7
  •  1
  •   Sujith    9 年前
    key=value1;value2;value3
    
    String[] toArray = rs.getString("key").split(";");
    
        8
  •  0
  •   Yonin    16 年前
    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;
    }
    
        9
  •  0
  •   Lokesh Garg    10 年前

    我试过了,能找到一个办法。 一种方法是定义listreesourcebundle的子类,然后定义string[]类型的实例变量。 并将值赋给键。这是密码

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