文档章节

保持顺序的 Java Properties 类

lee123lee
 lee123lee
发布于 2013/08/31 19:31
字数 312
阅读 62
收藏 0

Java 的 Properties 加载属性文件后是无法保证输出的顺序与文件中一致的,因为 Properties 是继承自 Hashtable 的, key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保证进出顺序的。

总有时候会有关心顺序一致的需求,恰如有 org.apache.commons.collections.OrderdMap(其实用 LinkedHashMap 就是保证顺序) 一样,我们也想要有个 OrderdProperties。网上查了下还真有:

http://livedocs.adobe.com/jrun/4/javadocs/jrunx/util/OrderedProperties.html

http://www.openrdf.org/doc/alibaba/2.0-rc4/apidocs/org/openrdf/repository/object/composition/helpers/OrderedProperties.html

不过没找到源码,其实自己写一个 OrderedProperties  也不难,并不需要重头写起,只要继承自 Properties,覆盖原来的 put/keys,keySet,stringPropertyNames 即可,其中用一个 LinkedHashSet 来保存它的所有 key。完整代码如下:

package com.mstar.investmeplugin;
 

import java.util.Collections;

import java.util.Enumeration;

import java.util.LinkedHashSet;

import java.util.Properties;

import java.util.Set;
 
/**

 * OrderedProperties

 * @author Unmi

 * @date 2012-12-07

 */

public class OrderedProperties extends Properties {
 

    private static final long serialVersionUID = -4627607243846121965L;

     

    private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
 

    public Enumeration<Object> keys() {

        return Collections.<Object> enumeration(keys);

    }
 

    public Object put(Object key, Object value) {

        keys.add(key);

        return super.put(key, value);

    }
 

    public Set<Object> keySet() {

        return keys;

    }
 

    public Set<String> stringPropertyNames() {

        Set<String> set = new LinkedHashSet<String>();
 

        for (Object key : this.keys) {

            set.add((String) key);

        }
 

        return set;

    }
}
用法:

Properties props =newOrderedProperties();
props.load(fileInputStream);
 
//通过 keys(), keySet() 或 stringPropertyNames 来遍历都能保证按文件中的顺序输出


© 著作权归作者所有

共有 人打赏支持
lee123lee
粉丝 51
博文 144
码字总数 122159
作品 1
闵行
高级程序员
Mybatis 关键组件(注意各组件的最佳作用域)

Mybatis 几个使用时的重要组件 SqlSessionFactoryBuilder 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域...

xd03122049
07/22
0
0
从读取properties文件说开去,浅谈web容器中类加载器

今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重...

jeffsui
2012/10/31
0
10
Spring Boot 配置加载顺序详解

使用 Spring Boot 会涉及到各种各样的配置,如开发、测试、线上就至少 3 套配置信息了。Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发、测试、线上环境使用不同的配置。 在 Spri...

Java技术栈
08/27
0
0
Java类动态加载(二)——动态加载class文件

想要在jvm启动后,动态的加载class类文件,我们首先需要了解Instrumentation、Attach、Agent、VirtualMachine、ClassFileTransformer这几个类的用法和他们之间的关系。 Java的com.sun.tools...

2k10
2015/03/20
0
0
JDBC 获取 Oracle 数据库连接(使用 Driver)

获取数据库连接的方法: 1. Driver 接口: •Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现 •在程序中不需要...

passionfly
2014/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

网站优化技术包括哪些内容

网站优化Incapsula超越简单的内容缓存,可以优化网站性能或应用程序的用户体验,优化包括内容缩小、动态文件压缩、图像压缩、会话重用优化、TCP优化和连接预合并。 动态文件压缩,普通的web...

上树的熊
20分钟前
1
0
业界 | Teradata全球调研:四分之三企业分析项目数据科学家“缺货”

当地时间10月15日,2018 Teradata全球用户大会在美国拉斯维加斯举行。来自15个国家的3000多位数据人参与了本次峰会。 大会第一日,Teradata发布了针对“企业数据分析”的2018年调研结果。 调...

Mr_zebra
21分钟前
1
0
java 通过Unsafe不使用构造器直接创建对象

这里有一个User没有无参构造 public class User { static { System.out.println("static {}"); } { System.out.println("{}"); } public User(Strin......

ValSong
22分钟前
1
0
eureka 高可用配置 unavailable-replicas 问题.

在使用spring cloud 配置eureka 高可用配置时.发现配置的节点一直无法获取心跳. eureka控制台界面上一直显示的挂载节点 是 unavailable-replicas 查看日志.就是获取心跳的地址不对. 默认的健...

拖鞋莫止步
23分钟前
2
0
Vue2 模板template的四种写法

<div id="app">    <h1>我是直接写在构造器里的模板1</h1></div> <template id="demo3">    <h1 style="color:red">我是选项模板3</h1></template> <script type="x-t......

粒子数反转
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部