有序的方式读写Properties文件 —— 对java.util.Properties的改写

目的

前几天,要做一个JSP读写Properties的模块,意在让用户能在web界面编辑系统配置。我很自然的用了java的Porperties工具类,读出写入不知多方便,但是用户说修改一个保存之后下次来就找不到自己的东西了(顺序乱了)。于是需要做一个有序的Properties文件读写类。果断上stackoverflow,找了两个例子(链接不记得了),两种方式,抄下来。

方式一,LinkedProperties

package com.example.common;

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class LinkedProperties extends Properties {

    private static final long serialVersionUID = 1L;

    private Map<Object, Object> linkMap = new LinkedHashMap<Object,Object>();

    @Override
    public synchronized Enumeration keys() {
        List<Object> keys = new ArrayList<Object>();
        for (Map.Entry<Object, Object> entry : linkMap.entrySet()) {
            keys.add(entry.getKey());
        }
        return Collections.enumeration(keys);
    }

    @Override
    public synchronized Object put(Object key, Object value){
        super.put(key, value);
        return linkMap.put(key, value);
    }

    @Override
    public synchronized boolean contains(Object value){
        return linkMap.containsValue(value);
    }

    @Override
    public boolean containsValue(Object value){
        return linkMap.containsValue(value);
    }

    @Override
    public synchronized Enumeration<Object> elements(){
        throw new UnsupportedOperationException(
          "Enumerations are so old-school, don‘t use them, "
        + "use keySet() or entrySet() instead");
    }

    @Override
    public Set<Map.Entry<Object, Object>> entrySet(){
        return linkMap.entrySet();
    }

    @Override
    public synchronized void clear(){
        super.clear();
        linkMap.clear();
    }

    @Override
    public synchronized boolean containsKey(Object key){
        return linkMap.containsKey(key);
    }

    public void store(Writer writer, String comments)
            throws IOException
    {
        super.putAll(linkMap);
        super.store(writer, comments);
    }

}
方式二,SequencedProperties

package com.example.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Properties;

@SuppressWarnings({"rawtypes", "unchecked"})
public class SequencedProperties extends Properties {

    private static final long serialVersionUID = 1L;

    private List keyList = new ArrayList();

    @Override
    public synchronized Enumeration keys() {
        return Collections.enumeration(keyList);
    }

    @Override
    public synchronized Object put(Object key, Object value) {
        if (!containsKey(key)) {
            keyList.add(key);
        }

        return super.put(key, value);
    }

    @Override
    public synchronized Object remove(Object key) {
        keyList.remove(key);

        return super.remove(key);
    }

    @Override
    public synchronized void putAll(Map values) {
        for (Object key : values.keySet()) {
            if (! containsKey(key)) {
                keyList.add(key);
            }
        }
        super.putAll(values);
    }

}
时间: 2024-11-07 15:48:32

有序的方式读写Properties文件 —— 对java.util.Properties的改写的相关文章

【Properties文件】Java使用Properties来读取配置文件

配置文件位置及内容 执行结果 程序代码 package Utils.ConfigFile;   import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enu

JAXB方式读写XML文件

import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXB; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import cn.com.starit.ts.nms.collec

java.util.Properties类

Properties类很常用么,几乎每个项目,从j2se到j2ee每个项目都没离开过他,就算是jsp+servlet+jdbc的东西,jdbc的配置信息也是写Properties,国际化也是Properties,cdn也是Properties,memcached也是 Properties.总之java.utils.*无所不用,不所不在.. 小记下Properties: java.util.Properties是对properties这类配置文件的映射.支持key-value类型和xml类型两种.

Android中使用java.util.Properties犯的错

今天尝试使用java.util.Properties来保存应用配置,然而遇到了好几个问题,对于熟悉此内容的来说可能都是猪一样的错误,但难免有像我一样的新手再次遇到,希望此文能有所帮助. 错误1 java.io.IOException: open failed: EROFS (Read-only file system)at java.io.File.createNewFile(File.java:940) 出错代码: 1 File file = new File("config.properti

java.util.Properties类 学习笔记

学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 3.掌握相对路径,能正确书写一个properties文件的相对路径. 一.认识properties文件 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注    释:前面加上#号 属性配置:以“键=值”的方式书写一个属性的配置信息. 3.propert

java.util.properties

http://gimgen1026.iteye.com/blog/152023 Properties 类已不是新东西了,它在 Java 编程的早期就有了,并且几乎没有什么变化.J2SE 的 Tiger 版本增强了这个类,不仅可以用它在单独一行中指定用等号分隔的多个键-值对,还可以用XML 文件装载和保存这些键-值对.在 驯服 Tiger的这一期文章中,John Zukowski 展示了如何驾驭这匹新一代的“役马”. J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置

JDK源码学习(9)- java.util.Properties实例与源码

java.util.Properties说明. 该类主要是读取属性配置文件,两种文件类型:普通文件格式为key = value:xml文件. 1)key = value示例如下: public class TestProperties { public static void main(String[] args) { Properties properties = new Properties(); FileInputStream fileInputStream; try { fileInpu

工作积累(二)——使用java.util.ResourceBundle和java.util.Properties实现常量功能

在 Java 中我们往往通过定义常量来使用一些值,方便我们进行修改配置,如: public classConstant {   public static final String IMG_ORI_PATH = "ori/";   public static final String IMG_THUMB_PATH = "thumb/";   -- } 这样我们在其他类中可以直接使用 Constant.IMG_ORI_PATH 来代替 "ori/"

java.util Properties使用记录

转:http://www.2cto.com/px/201006/47834.html 在java.util 包下面有一个类 Properties,该类主要用于读取以项目的配置文件(以.properties结尾的文件和xml文件). Properties的构造函数有两个,一个不带参数,一个使用一个Properties对象作为参数. 使用Properties读取.properties文件 test.properties文件如下: #测试环境配置:平台路径配置 jstrd_home=D:/TMS200