java加载properties文件

位置:
在这里插入图片描述
为了实现读取文件后的内容顺序与文件内容一致,继承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;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值