Java Properties 类读配置文件保持顺序
前几天,公司项目中有一个需求是读取配置文件的,而且最好能够保证加载到内存中的顺序能够和配置文件中的顺序一致,但是,如果使用 jdk 中提供的 Properties 类的话,读取配置文件后,加载到内存中的顺序是随机的,不能保证和原文件的顺序一致,因此,jdk 提供的 Properties 是不行的。
由于有这样的需求,而 Java 的 Properties 类又不能实现,因此只能想别的办法。我曾经想过,在把配置文件加载到内存后,对其进行排序,但这个方案会有很多限制,而且也有问题。配置文件中的信息会有很多,如果对其进行再排序的话,首先会影响系统的性能,其次,对程序的执行效率来讲,也会有一定的影响。最后,经过一番查证之后,同事找到了一篇类似的文章。
解决方案
从文章中了解到,Java 的 Properties 加载属性文件后是无法保证输出的顺序与文件中一致的,因为 Properties 是继承自 Hashtable 的, key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保证进出顺序的。
文章中已经给提供了代码,思路是继承自 Properties,覆盖原来的 put/keys,keySet,stringPropertyNames 即可,其中用一个 LinkedHashSet 来保存它的所有 key。完整代码如下:
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Properties;
import java.util.Set; /**
* OrderedProperties
* @author hanwl
* @date 2018-11-13
* @userd 使得Properties有序
*/
public class OrderedProperties extends Properties { private static final long serialVersionUID = 4710927773256743817L; private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>(); @Override
public Enumeration<Object> keys() {
return Collections.<Object> enumeration(keys);
} @Override
public Object put(Object key, Object value) {
keys.add(key);
return super.put(key, value);
} @Override
public Set<Object> keySet() {
return keys;
} @Override
public Set<String> stringPropertyNames() {
Set<String> set = new LinkedHashSet<String>(); for (Object key : this.keys) {
set.add((String) key);
} return set;
}
}
调用方法:
public class demo {
Properties prop = new OrderedProperties();
File appDir = GlobalVars.getLocalAppDataDir();
File dir = new File(appDir, "userHistory/");
if (!dir.exists()) {
dir.mkdirs();
}
try {
OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(dir+"\\user.properties",true), "utf-8");
//FileOutputStream fileOutputstream = new FileOutputStream(dir+"\\user.properties", false);
prop.setProperty("serverUrl", serverUrlTextField.getText());
prop.setProperty("userName", userNameTextField.getText());
prop.setProperty("password", passwordField.getText());
prop.store(oStreamWriter, null);
oStreamWriter.close(); } catch (Exception e) {
e.printStackTrace();
} Properties prop = new OrderedProperties();
File appDir = GlobalVars.getLocalAppDataDir();
File dir = new File(appDir, "userHistory/");
if(new File(dir+"\\user.properties").exists()){
try {
InputStreamReader iStreamReader = new InputStreamReader(new FileInputStream(dir+"\\user.properties"),"utf-8");
prop.load(iStreamReader);
Iterator<String> it = prop.stringPropertyNames().iterator();
while (it.hasNext()) {
String key = it.next();
String value = prop.getProperty(key);
System.out.println(key+":"+value);
}
iStreamReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 返回程序本地数据存储目录
* C:\Users\Administrator\AppData\Local\Founder\PublisherClient
* C:\Users\Administrator\AppData\Local\Founder\PrinterClient
* C:\Users\Administrator\AppData\Local\Founder\TypeSettingClient
* @return
*/
public static File getLocalAppDataDir() {
String appDataPath;
if (Util.isMac()) {
appDataPath = System.getProperty("user.home") + "/Library/";
}
else if (NativeUtil.libraryLoaded()) {
appDataPath = NativeUtil.getLocalAppDataFolder();
}
else {
appDataPath = System.getProperty("user.home");
} File founderDir = new File(appDataPath, Util.isWindows() || Util.isMac() ? "Founder" : ".Founder");
File appDir = new File(founderDir, CLIENT_TYPE.getClientName());
appDir.mkdirs(); return appDir;
}
Java Properties 类读配置文件保持顺序的更多相关文章
- java properties类读取配置文件
1.JAVA Properties类,在java.util包里,具体类是java.util.properties.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值 ...
- java工具类-读配置文件
///读配置文件 import java.io.InputStream;import java.util.HashMap;import java.util.Map;import java.util.M ...
- Java 数据类型:集合接口Map:HashTable;HashMap;IdentityHashMap;LinkedHashMap;Properties类读取配置文件;SortedMap接口和TreeMap实现类:【线程安全的ConcurrentHashMap】
Map集合java.util.Map Map用于保存具有映射关系的数据,因此Map集合里保存着两个值,一个是用于保存Map里的key,另外一组值用于保存Map里的value.key和value都可以是 ...
- 基于Java Properties类设置本地配置文件
一.Java Properties类介绍 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件, ...
- 读配置文件能够保持顺序的 Java Properties 类
序 前几天,公司项目中有一个需求是读取配置文件的.并且最好可以保证载入到内存中的顺序可以和配置文件里的顺序一致,可是.假设使用 jdk 中提供的 Properties 类的话,读取配置文件后.载入到内 ...
- 使用java.util.Properties类读写配置文件
J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置,虽说也并非难事,相比 java.util.Properties却要做额外的解析工作.而java.util.Proper ...
- day1 java基础回顾- Properties类与配置文件
Properties配置文件说明 Properties类对应.properties文件.文件内容是键值对,键值对之间使用"="或空格隔开.开头是"#"的表示注释 ...
- 【JAVA Properties类概述】
一.概述. 之前说过,该对象是和IO流相结合的技术,所以和IO流结合在一起来讲比较合适. public class Propertiesextends Hashtable<Object,Obje ...
- Java Properties类源码分析
一.Properties类介绍 java.util.Properties继承自java.util.Hashtable,从jdk1.1版本开始,Properties的实现基本上就没有什么大的变动.从ht ...
随机推荐
- SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器
SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器 1. T-SQL编程 (1)声明变量 declare @age int (2)为变量赋值 (3)while循环 ...
- java8 快速实现List转map 、分组、过滤等操作
利用java8新特性,可以用简洁高效的代码来实现一些数据处理. 定义1个Apple对象: public class Apple { private Integer id; private String ...
- 5.3Python数据处理篇之Sympy系列(三)---简化操作
目录 5.3简化操作 目录 前言 (一)有理数与多项式的简化 1.最简化-simplify() 2.展开-expand() 3.提公因式-factor() 4.合并同类项-ceiling() 5.简化 ...
- ThinkPHP中使用聚合查询去重求和
我使用的是TP5.1 首先去model类里面设置failed条件: 想要的效果: 数据库展示: 代码: eturn self::alias('gr') ->join('gs_staff gs', ...
- 使用docker swarm集群心得
本片关于使用docker swarm 集群心得,也是一些经验吧!过程描述可能简单! 根据一些公司使用经历接收一下问题并针对问题作出应对策略 1.docker swarm集群 主节点数必须是单数,也就是 ...
- 合并两个有序链表的golang实现
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:->->, ->-> 输出:->->->->-> ...
- 面向对象_del
老师的博客http://www.cnblogs.com/Eva-J/articles/7351812.html#_label7 内置的方法有很多不一定全都在object中 #python3中,所有类都 ...
- ubuntu18.04搭建hive
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...
- vim之快速查找功能
vim有强大的字符串查找功能. 我们通常在vim下要查找字符串的时候, 都是输入 / 或者 ? 加 需要查找的字符串来进行搜索,比如想搜索 super 这个单词, 可以输入 /super 或者 ...
- open-falcon自定义push数据无法在grafana显示
使用open-falcon自定义push数据,在open-falcon中数据能正常显示,而在grafana中添加监控项时却无法显示. 由上述现象可判断可能是由于open-falcon的api组件有问题 ...