我想通过PropertyResourceBundle为i18n使用属性文件。我目前的问题是我所拥有的文件上的密钥可以包括空格,例如:
key number 1 = value number 1
key2 = value2
因此,当我加载相应的属性文件时,第一个空格用作键值分隔符而不是'='符号。
然后,我的问题是:如何在不修改属性文件的情况下使用带有空格的键(我想避免添加任何斜杠或unicode字符代码)?有没有办法覆盖默认的属性文件分隔符,所以我可以设置'='作为唯一要考虑的?
答案 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);
}
}