如何使用包含空格的键的PropertyResourceBundle

时间:2014-04-27 21:44:43

标签: java properties-file

我想通过PropertyResourceBundle为i18n使用属性文件。我目前的问题是我所拥有的文件上的密钥可以包括空格,例如:

key number 1 = value number 1
key2 = value2

因此,当我加载相应的属性文件时,第一个空格用作键值分隔符而不是'='符号。

然后,我的问题是:如何在不修改属性文件的情况下使用带有空格的键(我想避免添加任何斜杠或unicode字符代码)?有没有办法覆盖默认的属性文件分隔符,所以我可以设置'='作为唯一要考虑的?

1 个答案:

答案 0 :(得分:1)

你必须编写自己的Properties类,jdk中的那个将空格视为分隔符,这是它的代码。你会发现,一旦遇到一个空白区域,它就会停止关键&开始这个价值。

private void load0 (LineReader lr) throws IOException {
    char[] convtBuf = new char[1024];
    int limit;
    int keyLen;
    int valueStart;
    char c;
    boolean hasSep;
    boolean precedingBackslash;

    while ((limit = lr.readLine()) >= 0) {
        c = 0;
        keyLen = 0;
        valueStart = limit;
        hasSep = false;

        //System.out.println("line=<" + new String(lineBuf, 0, limit) + ">");
        precedingBackslash = false;
        while (keyLen < limit) {
            c = lr.lineBuf[keyLen];
            //need check if escaped.
            if ((c == '=' ||  c == ':') && !precedingBackslash) {
                valueStart = keyLen + 1;
                hasSep = true;
                break;
            } else if ((c == ' ' || c == '\t' ||  c == '\f') && !precedingBackslash) {
                valueStart = keyLen + 1;
                break;
            }
            if (c == '\\') {
                precedingBackslash = !precedingBackslash;
            } else {
                precedingBackslash = false;
            }
            keyLen++;
        }
        while (valueStart < limit) {
            c = lr.lineBuf[valueStart];
            if (c != ' ' && c != '\t' &&  c != '\f') {
                if (!hasSep && (c == '=' ||  c == ':')) {
                    hasSep = true;
                } else {
                    break;
                }
            }
            valueStart++;
        }
        String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
        String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf);
        put(key, value);
    }
}