位置:
为了实现读取文件后的内容顺序与文件内容一致,继承Properties
package com.inesa.wm.nm.webfacade.util;
import java.util.*;
/**
* @date 2021/3/7 - 4:04
*/
public class OrderedProperties extends Properties {
private static final long serialVersionUID = -4627607243846121965L;
/**
* 因为LinkedHashSet有序,所以,key在调用put()的时候,存放到这里也就有序。
*/
private final LinkedHashSet<Object> keys = new LinkedHashSet<>();
@Override
public Enumeration<Object> keys() {
return Collections.enumeration(keys);
}
/**
* 在put的时候,只是把key有序的存到{@link OrderedProperties#keys}
* 取值的时候,根据有序的keys,可以有序的取出所有value
* 依然调用父类的put方法,也就是key value 键值对还是存在hashTable里.
* 只是现在多了个存key的属性{@link OrderedProperties#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);
}
}
package com.inesa.wm.nm.webfacade.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
/**
* properties文件工具类
* @description
* 在该类被加载的时候,它就会自动读取指定位置的配置文件内容并保存到静态属性中,高效且方便,一次加载,可多次使用
*
*
*/
public class PropertyUtilsMerge {
private static Logger logger = LoggerFactory.getLogger(PropertyUtilsMerge.class);
// 待解析的properties文件名称
private static final String FILE_NAME = "coordinate.properties";
// 用于接收解析过properties文件
private static Properties props;
// 静态代码块:在该类被加载到内容中时,该代码块会执行
static {
// 静态代码块执行时将要执行的方法
loadPropertiesFile();
}
synchronized static private void loadPropertiesFile() {
logger.debug("开始加载properties文件内容.......");
// props = new Properties() // 如果读取顺序不需要和存入顺序一致,可以使用此行代码
props = new OrderedProperties();
InputStream in = null;
try {
// 方式一:通过类加载器进行获取properties文件流(不用添加路径)
in = PropertyUtilsMerge.class.getClassLoader().getResourceAsStream("map/"+FILE_NAME);
// 方式二:通过类进行获取properties文件流(需要加/)
// in = PropertyUtils.class.getResourceAsStream("/bill.properties");
props.load(in);
} catch (NullPointerException e) {
logger.error("coordinate.properties文件未找到!");
} catch (IOException e) {
logger.error("出现IOException!");
} finally {
try {
if (null != in) {
in.close();
}
} catch (IOException e) {
logger.error("coordinate.properties文件流关闭出现异常");
}
}
logger.info("加载properties文件内容完成...........");
//logger.info("nomerge.properties文件内容:" + props);
}
/*
* 获取properties文件中指定key的value
* @date: 2020年07月13日 0013 16:17
* @param: key
* @return: java.lang.String
*/
public static String getProperty(String key) {
if (null == props) {
loadPropertiesFile();
}
return props.getProperty(key);
}
public static Map<String,String> allMap(){
Map<String, String> hashMap = new LinkedHashMap<>();
Set<Object> objects = props.keySet();
for (Object object : objects) {
String key = (String) object;
String value = (String) props.get(key);
hashMap.put(key,value);
}
return hashMap;
}
}