当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

能保存Properties文件注释的Properties工具类

发表于: 2013-08-28   作者:BrokenDreams   来源:转载   浏览:
摘要:         今天遇到一个小需求:由于java.util.Properties读取属性文件时会忽略注释,当写回去的时候,注释都没了。恰好一个项目中的配置文件会在部署后被某个Java程序修改一下,但修改了之后注释全没了,可能会给以后的参数调整带来困难。所以要解决这个问题。     &nb
        今天遇到一个小需求:由于java.util.Properties读取属性文件时会忽略注释,当写回去的时候,注释都没了。恰好一个项目中的配置文件会在部署后被某个Java程序修改一下,但修改了之后注释全没了,可能会给以后的参数调整带来困难。所以要解决这个问题。
        正好最近在看Java集合框架类库,干脆搞它一把。但是时间有限,也不能从头搞起,那就基于Properties搞搞看。
        先确定要解决什么问题。首要问题是,读取一个属性文件,然后写回去,注释全没了。从Properties代码片段里找一下原因:
    public synchronized void load(InputStream inStream) throws IOException {
        load0(new LineReader(inStream));
    }

        当Properties从一个字节流中加载属性时,会通过一个行读取器java.util.Properties.LineReader。
    /* Read in a "logical line" from an InputStream/Reader, skip all comment
     * and blank lines and filter out those leading whitespace characters 
     * (\u0020, \u0009 and \u000c) from the beginning of a "natural line". 
     * Method returns the char length of the "logical line" and stores 
     * the line in "lineBuf". 
     */
    class LineReader {
        public LineReader(InputStream inStream) {
            this.inStream = inStream;
            inByteBuf = new byte[8192]; 
	}

        从行读取器的注释上看,是在读行的时候跳过了comment。
        要解决这个问题好办,只要修改下这个行读取器,把comment放行就哦了。但是光把comment放开,那怎么保存呢?java.util.Properties扩展自java.util.Hashtable,键值对存在java.util.Hashtable.Entry里。这货也没法扩展,只能想办法在其他地方把comment存起来。首要问题有解决方案了。
        还有一个小问题,由于java.util.Properties扩展自java.util.Hashtable,并不保证key的顺序。所以读取然后写回文件,里面属性的顺序都乱了。想个办法保证一下顺序,猛然想到了java.util.LinkedHashMap,有木有,这个太合适了。
        最后赶紧写了一下,代码片段如下。
/** 
 *   CommentedProperties
 *   针对Properties进行扩展的工具类
 *   
 *   扩展的两个主要功能:
 *   1.对Properties文件中注释的保存。
 *       CommentedProperties在读取和保存Properties文件时,会将其注释
 *       一起读取保存。CommentedProperties中会提供方法来根据key获取
 *       相应注释。在CommentedProperties中添加一个K-V对时,也会提供
 *       添加相应注释的方法。
 *       
 *   2.对Properties文件中Key值顺序的保证。
 *       CommentedProperties会保证Key的顺序。从一个Properties文件中
 *       读取所有K-V对,保存到另一个Properties文件时,Key的顺序不会
 *       改变。
 *       
 *
 * @author BrokenDreams
 */
public class CommentedProperties{

	/**
	 * 内部属性表
	 */
	private final Properties props;

	/**
	 * 保存key与comment的映射,
	 * 同时利用这个映射来保证key的顺序。
	 */
	private final LinkedHashMap<String, String> keyCommentMap = new LinkedHashMap<String, String>();

	private static final String BLANK = "";

	public CommentedProperties() {
		super();
		props = new Properties();
	}

	public CommentedProperties(Properties defaults) {
		super();
		props = new Properties(defaults);
	}

        应该有更好的方式解决这个问题,但解决问题的同时顺序熟悉一下JDK相关类的代码页不是坏事,呵呵。这个类基本上能用了,可能还有很多可改进的地方。
        代码见附件,有用得着的可以下载来看看,HOHO,回家!

能保存Properties文件注释的Properties工具类

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
现在有这样一个需求:项目中要用到配置文件来实时操控是与否,首先我就想到了用xml来实现按,可是一
转自:http://mov-webhobo.iteye.com/blog/1786416 项目中一般会有多个配置properties文件,写了一
项目中一般会有多个配置properties文件,写了一个读取的工具类,见类图和代码 类说明: ClassPathPr
费话不多说,下载插件,如下地址:http://propedit.sourceforge.jp/index_en.html 点击进入后,如下
本章目标 掌握Properties类的使用 可以向普通及XML格式的文件中保存及读取属性 Properties类简介 Pr
知识学而不用,就等于没用,到真正用到的时候还得重新再学。最近在看几款开源模拟器的源码,里面涉
一, java web方式 直接把资源文件放在src根目录下 取名为commonConfig.properties , 内容如下: p
前言:简单地记录自己是如何用Java读取.properties文件的,可以说没什么技术含量的。。。 方法一:
Java中读写资源文件最重要的类是Properties,功能大致如下: 1. 读写Properties文件 2. 读写XML文件
例如:数据库连接信息写在.java文件中,若是 修改连接信息,就得暂停服务器重新发布 因此 经常变化
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号