A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林翔 中级黑马   /  2012-5-25 00:33  /  3598 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚刚看了 properties.load()可以直接将流中数据加载进集合,而我们自己分是要用=号去分割,那 properties.load()方法也是根据=号去分么?要是配置文件里没有等号,而是其他符号呢?那properties.load()还能用么?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 小小企鹅 于 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

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
没有等号,对应的键值就加载不了吧
回复 使用道具 举报
要看源码用工具,或者找JDK中src包
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马