今天遇到一个小需求:由于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,回家!
分享到:
相关推荐
此工具类只用于Java后端在操作Properties文件的时候写的工具类,方便properties文件的存取操作
通过程序生成properties文件的工具类,并可根据添加顺序生成,可添加注释,调用步骤如下: 1.OutputOrderProperties p = new OutputOrderProperties(); 2.FileInputStream fs = new FileInputStream("文件路径"); 3....
6.扩展Properties类,添加支持注释的保存和保留文件原顺序的功能 7. Zip压缩文件工具类 8.利用反射机制进行排序工具类,支持数组、List、Set、Map的排序,可以支持多属性排序,支持子对象中的属性排序(例user对象中...
该库的主要目标是与java.util.Properties类兼容。 不是API明智的(API完全不同),但是能够读取每个Java .properties文件并获得与java.util.Properties完全相同的键值对。 但是,Apron会维护属性文件中条目的顺序...
属性实用 提供给开发人员社区的该实用程序允许将参数注入到类字段中,这些属性是从属性文件或jdbc连接中检索的。...注释您的类,以指示.properties文件的相对路径,并注释字段以 import com.xpec.properties
右键单击该项目并选择 Properties | Configuration Properties | Build,然后在 XML Documentation File 选项中输入用于保存 XML 文件的路径。当该项目生成时,将创建一个 XML 文件,其中包含所有 XML 注释。下面是 ...
增加/扩展某一工具类,一般xxxUtilsExt为文件后缀 随便提一下使用第三方工具类的好处 例如:FileUtils.writeStringToFile(outFile, result, "UTF-8"); 只一句代码就可以将一个字符串写入一个文件,如果我们...
这个叫不上框架,只能说是一个工具类。 框架大小在400KB 包括源码在600KB 里面分为两个架包一个是有源码的 这样就直接可以查看注释 通过注解自动注入 因为反射 会让程序变慢100~200毫秒左右,基本感觉不出来.硬件...
├ cn.eoe.app.utils --工具类包 ├ cn.eoe.app.view --Fragment相关类的包 ├ cn.eoe.app.widget --自定义view组件包 2、libs目录 libs目录用于存放项目引用的第三方jar包。 libs目录里的jar包文件: libs |- ...
5. INTELLJ IDEA 如何设置类头注释 3 6. 静态代码检查工具INTELLIJ IDEA插件介绍 4 6.1. CHECKSTYLE的INTELLIJ IDEA插件设置,插件安装 4 6.2. CHECKSTYLE客户化规则配置 5 6.3. 执行代码检查 6 7. IDEA 安装JREBEL...
日常工作总结,加上网上收集,各式各样的几乎都能找到,所有功能性代码都是独立的类,类与类之间没有联系,可以单独引用至项目,分享出来,方便大家,几乎都有注释,喜欢的请点赞,不断完善收集中... ## 样板图片...
本工具基于mybatis-generator-1.3.2进行修改,修改内容如下: 1、增加Dao配套的Service接口和实现类。 2、去掉Example相关的类,...10、model类中属性自动添加数据库中设置的注释。 11、对原版配置文件有详细的说明。
其中,common中主要放一些全局会使用到的类,例如我会将工具类、默认的controller、pojo、dao放在里面;core中主要是放集成的工具,例如我这里放了对FreeMarkerView的扩展,可以将mybatis的相关类,或者以后集成更多...
本人在教Java方向课程时,发现现组长们不能象以前班级的学长写出封装得比较好的DAO工具类。于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK ...
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 自动...
代码行,类数,注释百分比 代码复杂度(文件复杂度) 代码闻起来 代码覆盖率(行覆盖率) 违反编码风格 它依靠标准化的外部工具: , , 和进行分析并报告指标,然后将这些指标发布到SonarQube。 安装 运行mvn ...
在Biotechniques中阅读我们的论文:http://www.ncbi.nlm.nih.gov/pubmed/24502797分类单元识别工具(TUIT)是一种免费的独立于平台的开源软件,专门设计用于通过以下方式促进核苷酸序列的分类注释:针对NCBI数据库...
一个XML工具类,一个系统工具类,一个结点对象,一个BUILDER,如此而已,我就不信这个小东西对于经常读取XML配置文件的人来说不能提供方便? 大家有心情试试看,提供源码和DEMO! 目前是1.0版本,本人将不...