黑马程序员技术交流社区
标题:
关于properties.load()方法
[打印本页]
作者:
林翔
时间:
2012-5-25 00:33
标题:
关于properties.load()方法
刚刚看了 properties.load()可以直接将流中数据加载进集合,而我们自己分是要用=号去分割,那 properties.load()方法也是根据=号去分么?要是配置文件里没有等号,而是其他符号呢?那properties.load()还能用么?
作者:
小小企鹅
时间:
2012-5-25 01:07
本帖最后由 小小企鹅 于 2012-10-27 22:43 编辑
如果配置文件里没有格式,properties抛出IOException,没有加载
附上jdk1.6 java.util.Properties的load(Reader reader)源码:
load0(new LineReader(reader));
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);
}
}
loadConvert为Properties的私有方法,第二个参数指定偏移值、第三个参数指定长度,返回字符串
KeyLen为key的长度,offset为0
limit - valueStart为value的长度,offset为valueStart
作者:
黑马11期李项京
时间:
2012-5-25 09:33
没有等号,对应的键值就加载不了吧
作者:
niceBoy
时间:
2012-5-25 12:51
要看源码用工具,或者找JDK中src包
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2