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 ...
随机推荐
- 【原】Java学习笔记021 - Object
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 类 Object: ...
- Java 集合系列(三)—— LinkedList
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 LinkedList LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列. 它的最基本存储结构是一个节点:每 ...
- 什么是POE交换机?
POE交换机和普通交换机的区别有: 1.POE交换机不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电 .普通的交换机主要是交换数据的功能,并没有具备供电的功能. 2.现在的网络高清摄像机 ...
- Windows server 2012 R2 部署WSUS补丁服务
一.WSUS 安装要求 1.硬件要求: 对于多达 13000 个客户端的服务器,建议使用以下硬件:* 4 Core E5-2609 2.1GHz 的处理器* 8 GB 的 RAM 2.软件要求: 要使 ...
- python开发【lambda篇】
lambda 与 python 高级函数的配套使用 filter函数 过滤 __author__ = "Tang" # filter(lambda, []) people = [' ...
- rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较
Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的 ...
- (四)Exploring Your Cluster
The REST API Now that we have our node (and cluster) up and running, the next step is to understand ...
- 2018-2019-2 20175332-实验一《Java开发环境的熟悉》实验报告
一.安装IDEA 1.在官方网站下载IDEA安装包https://www.jetbrains.com/idea/download/#section=windows 2.破解软件,第一次参考博客是:ht ...
- Linux笔记-nohup和&
nohup:忽略SIGHUP信号,当关闭shell之后,程序仍然执行,但是如果在shell中 ctrl+c,会结束程序 &:忽略SIGINT信号,程序后台执行,在shell中 ctrl+c,程 ...
- C#模板设计模式使用和学习心得
模板设计模式: 模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种: 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现. 模版方法:由抽象类 ...