黑马程序员技术交流社区

标题: 关于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