`
BrokenDreams
  • 浏览: 248976 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:97932
社区版块
存档分类
最新评论

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

 
阅读更多
        今天遇到一个小需求:由于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,回家!
分享到:
评论
6 楼 BrokenDreams 2016-01-06  
浩_亿 写道
BrokenDreams 写道
浩_亿 写道
内部类LineReader中的InputStream流在什么时候关闭的?

LineReader是个包装,里面的InputStream是外部传进来的,外部做控制就行了吧。这里不需要关心了。 你知道我是谁吧??


哪能不知道呢!学习的榜样。但是里面你不是有一个load(File file)方法吗?那里面的流应该在你这个工具类中关闭吧!

恩 对  应该有一个,如果是这样话,就要自己内部保证关闭了,我的代码里可能没关吧  哈哈 被你发现了~~!
5 楼 浩_亿 2016-01-06  
BrokenDreams 写道
浩_亿 写道
内部类LineReader中的InputStream流在什么时候关闭的?

LineReader是个包装,里面的InputStream是外部传进来的,外部做控制就行了吧。这里不需要关心了。 你知道我是谁吧??


哪能不知道呢!学习的榜样。但是里面你不是有一个load(File file)方法吗?那里面的流应该在你这个工具类中关闭吧!
4 楼 BrokenDreams 2016-01-05  
浩_亿 写道
内部类LineReader中的InputStream流在什么时候关闭的?

LineReader是个包装,里面的InputStream是外部传进来的,外部做控制就行了吧。这里不需要关心了。 你知道我是谁吧??
3 楼 浩_亿 2016-01-05  
内部类LineReader中的InputStream流在什么时候关闭的?
2 楼 liude33 2015-06-17  
正需要这功能,谢啦。
1 楼 zhc0705 2014-12-04  
  叼、谢谢大神了

相关推荐

    java properties文件操作工具类,可追加修改

    此工具类只用于Java后端在操作Properties文件的时候写的工具类,方便properties文件的存取操作

    java生成properties文件工具类

    通过程序生成properties文件的工具类,并可根据添加顺序生成,可添加注释,调用步骤如下: 1.OutputOrderProperties p = new OutputOrderProperties(); 2.FileInputStream fs = new FileInputStream("文件路径"); 3....

    通用工具类

    6.扩展Properties类,添加支持注释的保存和保留文件原顺序的功能 7. Zip压缩文件工具类 8.利用反射机制进行排序工具类,支持数组、List、Set、Map的排序,可以支持多属性排序,支持子对象中的属性排序(例user对象中...

    apron:高级属性—以更合理的方式读取和写入Java .properties文件

    该库的主要目标是与java.util.Properties类兼容。 不是API明智的(API完全不同),但是能够读取每个Java .properties文件并获得与java.util.Properties完全相同的键值对。 但是,Apron会维护属性文件中条目的顺序...

    properties-util:该实用工具可轻松访问属性文件和存储在数据库中的属性,此工具是免费创建的,供社区使用

    属性实用 提供给开发人员社区的该实用程序允许将参数注入到类字段中,这些属性是从属性文件或jdbc连接中检索的。...注释您的类,以指示.properties文件的相对路径,并注释字段以 import com.xpec.properties

    编写代码文档资料ndoc1.3

    右键单击该项目并选择 Properties | Configuration Properties | Build,然后在 XML Documentation File 选项中输入用于保存 XML 文件的路径。当该项目生成时,将创建一个 XML 文件,其中包含所有 XML 注释。下面是 ...

    玩转模板--自动代码生成工程

    增加/扩展某一工具类,一般xxxUtilsExt为文件后缀 随便提一下使用第三方工具类的好处 例如:FileUtils.writeStringToFile&#40;outFile, result, "UTF-8"&#41;; 只一句代码就可以将一个字符串写入一个文件,如果我们...

    android 开发框架,码农偷懒专用

    这个叫不上框架,只能说是一个工具类。 框架大小在400KB 包括源码在600KB 里面分为两个架包一个是有源码的 这样就直接可以查看注释 通过注解自动注入 因为反射 会让程序变慢100~200毫秒左右,基本感觉不出来.硬件...

    eoe客户端源代码

    ├ cn.eoe.app.utils --工具类包 ├ cn.eoe.app.view --Fragment相关类的包 ├ cn.eoe.app.widget --自定义view组件包 2、libs目录 libs目录用于存放项目引用的第三方jar包。 libs目录里的jar包文件: libs |- ...

    IDEA14 学习笔记

    5. INTELLJ IDEA 如何设置类头注释 3 6. 静态代码检查工具INTELLIJ IDEA插件介绍 4 6.1. CHECKSTYLE的INTELLIJ IDEA插件设置,插件安装 4 6.2. CHECKSTYLE客户化规则配置 5 6.3. 执行代码检查 6 7. IDEA 安装JREBEL...

    c#搜集的帮助类 c#搜集的帮助类

    日常工作总结,加上网上收集,各式各样的几乎都能找到,所有功能性代码都是独立的类,类与类之间没有联系,可以单独引用至项目,分享出来,方便大家,几乎都有注释,喜欢的请点赞,不断完善收集中... ## 样板图片...

    mybatis-generator(mybatis生成工具修改版)

    本工具基于mybatis-generator-1.3.2进行修改,修改内容如下: 1、增加Dao配套的Service接口和实现类。 2、去掉Example相关的类,...10、model类中属性自动添加数据库中设置的注释。 11、对原版配置文件有详细的说明。

    基于SSM+FreeMarker搭建的Java后台工程模板+源代码+文档说明

    其中,common中主要放一些全局会使用到的类,例如我会将工具类、默认的controller、pojo、dao放在里面;core中主要是放集成的工具,例如我这里放了对FreeMarkerView的扩展,可以将mybatis的相关类,或者以后集成更多...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    本人在教Java方向课程时,发现现组长们不能象以前班级的学长写出封装得比较好的DAO工具类。于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK ...

    Eclipse_Swt_Jface_核心应用_部分19

    3.2.1 设置编译后.class文件的保存目录 23 3.2.2 导入项目使用的包 25 3.2.3 设置编译方式 26 3.2.4 运行程序 27 3.3 常用的代码编辑功能 28 3.3.1 添加注释 28 3.3.2 自定义格式化代码 28 3.3.3 自动...

    ruby_sonar_plugin

    代码行,类数,注释百分比 代码复杂度(文件复杂度) 代码闻起来 代码覆盖率(行覆盖率) 违反编码风格 它依靠标准化的外部工具: , , 和进行分析并报告指标,然后将这些指标发布到SonarQube。 安装 运行mvn ...

    TUIT:分类单位识别工具-开源

    在Biotechniques中阅读我们的论文:http://www.ncbi.nlm.nih.gov/pubmed/24502797分类单元识别工具(TUIT)是一种免费的独立于平台的开源软件,专门设计用于通过以下方式促进核苷酸序列的分类注释:针对NCBI数据库...

    config4j

    一个XML工具类,一个系统工具类,一个结点对象,一个BUILDER,如此而已,我就不信这个小东西对于经常读取XML配置文件的人来说不能提供方便? 大家有心情试试看,提供源码和DEMO! 目前是1.0版本,本人将不...

Global site tag (gtag.js) - Google Analytics