加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

深入浅出的分析 Properties

发布时间:2019-11-12 14:17:08 所属栏目:优化 来源:炸鸡可乐
导读:最近在看 java 集合源码的时候,发现原来我们经常使用的 Properties 类既然继承自 Hashtable!又涨见识了! 01. 摘要 在集合系列的第一章,咱们了解到,Map 的实现类有 HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properti

可以发现,在 Properties 构造方法初始化阶段,如果你给了一个自定义的 defaults ,当调用 Hashtable 的 get 方法没有搜索到元素值的时候,并且 defaults 也不等于空,那么就会进一步在 defaults 里面进行搜索元素值。

方法测试如下:

  1. public static void main(String[] args) { 
  2.     Properties properties = new Properties(); 
  3.     properties.setProperty("name1","张三"); 
  4.     properties.setProperty("name2","张四"); 
  5.     properties.setProperty("name3","张五"); 
  6.     //将 properties 作为参数初始化到 newProperties 中 
  7.     Properties newProperties = new Properties(properties); 
  8.     newProperties.setProperty("name4","李三"); 
  9.     //查询key中 name1 的值 
  10.     System.out.println("查询结果:" + properties.getProperty("name1")); 

输出结果:

通过key查询结果:张三

load方法(加载配置文件)

load 方法,表示将 properties 文件以输入流的形式加载文件,并且提取里面的键、值对,将键值对元素添加到 map 中去。

打开 Properties 的 load 方法,源码如下:

  1. public synchronized void load(InputStream inStream) throws IOException { 
  2.     //读取文件流 
  3.     load0(new LineReader(inStream)); 

load0 方法,源码如下:

  1. private void load0 (LineReader lr) throws IOException { 
  2.     char[] convtBuf = new char[1024]; 
  3.     int limit; 
  4.     int keyLen; 
  5.     int valueStart; 
  6.     char c; 
  7.     boolean hasSep; 
  8.     boolean precedingBackslash; 
  9.  
  10.     //一行一行的读取 
  11.     while ((limit = lr.readLine()) >= 0) { 
  12.         c = 0; 
  13.         keyLen = 0; 
  14.         valueStart = limit; 
  15.         hasSep = false; 
  16.  
  17.         precedingBackslash = false; 
  18.         //判断key的长度 
  19.         while (keyLen < limit) { 
  20.             c = lr.lineBuf[keyLen]; 
  21.             if ((c == '=' ||  c == ':') && !precedingBackslash) { 
  22.                 valueStart = keyLen + 1; 
  23.                 hasSep = true; 
  24.                 break; 
  25.             } else if ((c == ' ' || c == 't' ||  c == 'f') && !precedingBackslash) { 
  26.                 valueStart = keyLen + 1; 
  27.                 break; 
  28.             } 
  29.             if (c == '') { 
  30.                 precedingBackslash = !precedingBackslash; 
  31.             } else { 
  32.                 precedingBackslash = false; 
  33.             } 
  34.             keyLen++; 
  35.         } 
  36.         //获取值的起始位置 
  37.         while (valueStart < limit) { 
  38.             c = lr.lineBuf[valueStart]; 
  39.             if (c != ' ' && c != 't' &&  c != 'f') { 
  40.                 if (!hasSep && (c == '=' ||  c == ':')) { 
  41.                     hasSep = true; 
  42.                 } else { 
  43.                     break; 
  44.                 } 
  45.             } 
  46.             valueStart++; 
  47.         } 
  48.         //获取文件中的键和值参数 
  49.         String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf); 
  50.         String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf); 
  51.         //调用 Hashtable 的 put 方法,将键值加入 map 中 
  52.         put(key, value); 
  53.     } 

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读