广告
返回顶部
首页 > 资讯 > 精选 >Java代码实现对properties文件有序的读写的示例
  • 631
分享到

Java代码实现对properties文件有序的读写的示例

properties有序ava 2023-05-30 21:05:14 631人浏览 安东尼
摘要

最近遇到一项需求,要求把properties文件中的内容读取出来供用户修改,修改完后需要再重新保存到properties文件中。很简单的需求吧,可问题是Properties是继承自HashTable的,直接通过keySet()、keys()

最近遇到一项需求,要求把properties文件中的内容读取出来供用户修改,修改完后需要再重新保存到properties文件中。很简单的需求吧,可问题是Properties是继承自HashTable的,直接通过keySet()、keys()或entrySet()方法对Properties中的元素进行遍历时取出来的内容顺序与properties文件中的顺序不一致,这是问题一;问题二是就算取出来的时候是有序的,保存到文件中时又是无序的了。

当然,解决这两个问题的方法有很多。我最终采用的方法是自定义一个PropertiesUtil类,该类继承自Properties。PropertiesUtil提供一个返回由key按照存入顺序组成的List的方法,geTKEyList(),这样问题一就解决了。那如何保证getKeyList()方法返回的就是有序的key组成的集合呢?我查看了一下Properties方法的源码,发现其setProperty()方法实际上就是调用了父类HashTable的put()方法,其次Properties在从文件中加载内容时是按照文件顺序进行读取,然后调用父类HashTable的put()方法进行储存。所以问题的解决办法就是PropertiesUtil持有一个私有的可以有序存储key的集合,然后重写父类的put()方法,在方法体中照常通过super.put()进行属性的存储,同时将key添加到存储key的集合中。

Properties提供有save()方法和store()方法可以将当前对象的内容存放到指定的输出流中,但它们的底层逻辑都是一样的。通过调用keys()方法获取一个Enumeration,然后对该Enumeration进行遍历,依次将对应的key和value写入到输出流中,所以要保证写入是有序的,就要保证遍历keys()返回的Enumeration时取出的元素key是有序的。所以解决方法是重写keys()方法,保证遍历返回的Enumeration时得到的key是有序的。

下面就示范怎么按顺序读properties文件,以及还得按原来的顺序写properties文件。

package com.lxk.propertyFileTest;  import java.util.*;   public class OrderedProperties extends Properties {   private static final long serialVersionUID = -4627607243846121965L;       private final LinkedHashSet<Object> keys = new LinkedHashSet<>();    @Override   public Enumeration<Object> keys() {     return Collections.enumeration(keys);   }       @Override   public Object put(Object key, Object value) {     keys.add(key);     return super.put(key, value);   }       @Override   public Set<String> stringPropertyNames() {     Set<String> set = new LinkedHashSet<>();     for (Object key : this.keys) {       set.add((String) key);     }     return set;   }       @Override   public Set<Object> keySet() {     return keys;   }    //这个就不设置有序了,因为涉及到HashTable内部类:EntrySet,不好复写。   //public LinkedHashSet<Map.Entry<Object, Object>> entrySet() {   //  LinkedHashSet<Map.Entry<Object, Object>> entrySet = new LinkedHashSet<>();   //  for (Object key : keys) {   //   //  }   //  return entrySet;   //}       @Override   public Enumeration<?> propertyNames() {     return Collections.enumeration(keys);   } } 

--结束END--

本文标题: Java代码实现对properties文件有序的读写的示例

本文链接: https://www.lsjlt.com/news/221248.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作