前几天,公司项目中有一个需求是读取配置文件的。并且最好可以保证载入到内存中的顺序可以和配置文件里的顺序一致,可是。假设使用 jdk 中提供的 Properties 类的话,读取配置文件后。载入到内存中的顺序是随机的,不能保证和原文件的顺序一致,因此,jdk 提供的 Properties 是不行的。


背景


因为有这种需求。而 Java 的 Properties 类又不能实现,因此仅仅能想别的办法。我以前想过,在把配置文件载入到内存后,对其进行排序,但这个方法会有非常多限制,并且也有问题。

配置文件里的信息会有非常多,假设对其进行再排序的话。首先会影响系统的性能,其次,对程序的运行效率来讲,也会有一定的影响。最后,经过一番查证之后。同事找到了一篇类似的文章。



解决方式


从文章中了解到,Java 的 Properties 载入属性文件后是无法保证输出的顺序与文件里一致的,由于 Properties 是继承自 Hashtable 的, key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保证进出顺序的。

文章中已经给提供了代码,思路是继承自 Properties,覆盖原来的 put/keys,keySet,stringPropertyNames 就可以,当中用一个 LinkedHashSet 来保存它的全部 key。完整代码例如以下:

  1. <span style="font-family:Comic Sans MS;">package com.mstar.investmeplugin;
  2.  
  3. import java.util.Collections;
  4. import java.util.Enumeration;
  5. import java.util.LinkedHashSet;
  6. import java.util.Properties;
  7. import java.util.Set;
  8.  
  9. /**
  10. * OrderedProperties
  11. * @author liii
  12. * @date 2015-07-10
  13. */
  14. public class OrderedProperties extends Properties {
  15.  
  16. private static final long serialVersionUID = -4627607243846121965L;
  17.  
  18. private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
  19.  
  20. public Enumeration<Object> keys() {
  21. return Collections.<Object> enumeration(keys);
  22. }
  23.  
  24. public Object put(Object key, Object value) {
  25. keys.add(key);
  26. return super.put(key, value);
  27. }
  28.  
  29. public Set<Object> keySet() {
  30. return keys;
  31. }
  32.  
  33. public Set<String> stringPropertyNames() {
  34. Set<String> set = new LinkedHashSet<String>();
  35.  
  36. for (Object key : this.keys) {
  37. set.add((String) key);
  38. }
  39.  
  40. return set;
  41. }
  42. }</span>

调用方法


  1. <span style="font-family:Comic Sans MS;">Properties props = new OrderedProperties();
  2. props.load(fileInputStream);
  3.  
  4. //通过 keys(), keySet() 或 stringPropertyNames 来遍历都能保证按文件里的顺序输出</span>


结束语


这样的特定的需求。曾经倒是没怎么接触过,不给通过这次的经历,发现了一点,自己的积累还是非常少,不多说了。继续努力吧。


參考:

读配置文件能够保持顺序的 Java Properties 类的更多相关文章

  1. java properties类读取配置文件

    1.JAVA Properties类,在java.util包里,具体类是java.util.properties.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值 ...

  2. 基于Java Properties类设置本地配置文件

    一.Java Properties类介绍 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件, ...

  3. Java Properties 类读配置文件保持顺序

    前几天,公司项目中有一个需求是读取配置文件的,而且最好能够保证加载到内存中的顺序能够和配置文件中的顺序一致,但是,如果使用 jdk 中提供的 Properties 类的话,读取配置文件后,加载到内存中 ...

  4. 【JAVA Properties类概述】

    一.概述. 之前说过,该对象是和IO流相结合的技术,所以和IO流结合在一起来讲比较合适. public class Propertiesextends Hashtable<Object,Obje ...

  5. Java Properties类源码分析

    一.Properties类介绍 java.util.Properties继承自java.util.Hashtable,从jdk1.1版本开始,Properties的实现基本上就没有什么大的变动.从ht ...

  6. java Properties类使用基础

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. Java Properties类

    Properties 是哈希表的一个子类.它是用来维持值列表,其中的键是一个字符串,值也是一个字符串. Properties类被许多其他的Java类使用.例如,它是对象通过System.getProp ...

  8. java Properties类得到当前的系统属性

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt218 package com.shi.simpleUtil; import  ...

  9. Java中Properties类的操作配置文件

    知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...

随机推荐

  1. ORACLE 11g 生产中高水位线(HWM)处理

    数据库中表不断的insert,delete,update,导致表和索引出现碎片.这会导致HWM之前有很多的空闲空间,而oracle在做全表扫描的时候会读取HWM一下的所有块,这样会产生更多的IO,影响 ...

  2. java使用FileUtils文件操作神器

    前言: 在工作当中我们往往遇到很多文件的操作,我们也习惯写一些自己定义的工具类来简化文件操作,其实apache的commons的FileUtils类就是这样一个工具类,使用它能大大的简化我们对文件的操 ...

  3. 微信小程序开发之animation动画实现

    1. 创建动画实例 wx.createAnimation(OBJECT) 创建一个动画实例animation.调用实例的方法来描述动画.最后通过动画实例的export方法导出动画数据传递给组件的ani ...

  4. Java语言基础(数组)

    Java语言基础(数组概述和定义格式说明) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数 ...

  5. 记我安装Caffe的血泪史(1)

    Caffe的安装我主要参考的是这篇博客 http://blog.csdn.net/ubunfans/article/details/47724341 按照他的方法我很快就安好了cuda8(为后面安装了 ...

  6. OnLineML:时序数据挖掘

    关于时序分析: 我们跟随时间的脚步,试图解释现在.理解过去.甚至预测未来........ 原文链接:http://blog.sciencenet.cn/home.php?mod=space&u ...

  7. spring中log4j的使用---转载

    原文链接:http://www.codeceo.com/article/log4j-usage.html 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供 ...

  8. getopt函数

    getopt -- 解析命令的可选项   [说明]getopt只是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,格式如下:   1.形如:cmd [-a][-b] //对短选项的解析: ...

  9. Java中数组获取最大值

    最大值获取:从数组的所有元素中找出最大值. 实现思路: 定义变量,保存数组0索引上的元素 遍历数组,获取出数组中的每个元素 将遍历到的元素和保存数组0索引上值的变量进行比较 如果数组元素的值大于了变量 ...

  10. selenium的显示等待和隐式等待区别

    1.selenium的显示等待 原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.(简而言之:就 ...