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

能保存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文件的存取操作

    Properties 文件比较工具

    总之,“Properties文件比较工具”是Java开发中一个实用的小型应用,它利用了Java标准库提供的`Properties`类,为开发者提供了便利,提高了工作效率。通过分析`diffProperties.java`和`property.java`源代码,我们...

    JAVA 解决Properties文件保存中文乱码

    本文将深入探讨如何在Java中解决Properties文件保存和读取中文乱码的挑战。 首先,我们需要理解Java默认使用ISO-8859-1编码来处理Properties文件。由于此编码不支持大部分中文字符,因此在保存或加载包含中文的...

    java生成properties文件工具类

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

    java修改Properties文件,让输出格式与输入格式保持不变

    Properties类在加载和保存文件时,会按照一定的规则进行格式化,如转换非ASCII字符为Unicode转义序列,去除多余的空格等。这些行为可能导致原始文件的格式被破坏。为了解决这个问题,我们可以自定义一个Properties...

    读取Properties信息工具类

    在Java编程中,Properties类是用于处理属性文件的关键工具,它...通过创建这样的Properties工具类,我们可以简化与属性文件交互的代码,提高代码的可读性和可维护性。在实际项目中,这样的工具类是非常常见且实用的。

    Python实现读取Properties配置文件的方法

    为了在Python中读取这样的文件,我们可以创建一个名为`Properties`的类,该类包含两个方法:`__init__`和`getProperties`。`__init__`用于初始化类实例,并接收文件路径作为参数;`getProperties`方法负责打开文件,...

    读取以及修改properties文件

    这里,`"new_value"`是新的值,`"Modified properties"`是保存时的注释。 3. **处理异常** 在处理文件操作时,异常处理是非常重要的。例如,文件可能不存在,或者没有足够的权限来读写。因此,建议使用try-with-...

    读取properties返回map并写入文件

    读取.properties文件的主要工具有Java的Properties类。以下是一个简单的示例,展示如何使用Properties类加载文件并将其内容转换为Map: ```java import java.io.*; import java.util.*; public class ...

    java 动态修改Properties,src下或者指定路径

    8. `prop.store(fos, "Update '" + key + "' value")`将修改保存回文件,并添加一个描述性注释。 9. 最后,关闭`fos`以确保所有更改都被写入。 在`main`方法中,获取当前工作目录的路径,拼接上Properties文件的...

    Java源码读写Properties文件.rar

    总结来说,Java中的Properties类是管理配置文件的关键工具,它提供了一套完整的API来读取、写入和操作键值对。掌握这部分知识对于任何Java开发者来说都是至关重要的,因为配置文件在软件开发中扮演着不可或缺的角色...

    java操作properties文件

    `store()`方法的第二个参数是注释,会在保存文件时写入。 七、处理国际化和本地化 使用`Properties`类进行i18n和l10n时,需要创建不同语言版本的.properties文件,例如`messages_en.properties`(英语)和`messages...

    Java_Properties_类读取配置文件信息

    总结来说,`Properties` 类是 Java 中处理 `.properties` 配置文件的关键工具,它提供了方便的接口,让我们能够轻松地在程序中管理和操作配置信息。这使得 Java 应用程序能够适应不同环境,提升灵活性和可维护性。

    读取properties文件

    `Properties`类是Java中处理配置文件的强大工具,它不仅提供了加载和读取`.properties`文件的功能,还支持写入和保存属性,使得开发人员能够轻松地管理应用程序的各种配置信息。掌握`Properties`类的使用对于任何...

    ResourceBundle与Properties读取maven中resources目录下的资源文件

    `Properties`类是Java提供的用于处理配置文件的一个工具类。它继承自`Hashtable`类,并实现了`Map`接口,因此可以看作是一种特殊的`Map`,用来存储键值对。不同之处在于,`Properties`类中的键和值都必须是`String`...

    eclipse中.properties文件编辑

    在Eclipse这款强大的Java开发工具中,`.properties`文件是一种常用的配置文件格式,它用于存储应用的配置信息,如国际化(i18n)文本、系统设置等。Eclipse默认的编辑器对于这类文件的支持可能不够完善,因此,...

    Java加载配置文件工具类

    10. **文档**:良好的注释和使用示例可以帮助其他开发者更好地理解和使用这个工具类。 在给定的标签"源码 工具"中,我们可以推断这个工具类提供了源代码,可能是一个开源项目,允许开发者查看和定制代码。"shs"可能...

    eclipse的properties文件插件

    1. **代码高亮和语法检查**:插件会为.properties文件提供颜色编码,使得关键字、注释和字符串更加醒目,同时还能进行语法错误检查,提高编辑的准确性。 2. **自动完成和提示**:在输入键值对时,插件可能会提供...

    Properties插件文件

    MyEclipse作为强大的Java开发工具,其Properties文件插件进一步增强了对这类文件的支持。开发者可以在集成环境中直接预览和修改,而无需离开IDE。这对于频繁处理Properties文件的开发人员来说,无疑提高了工作效率。...

Global site tag (gtag.js) - Google Analytics