按顺序读取properties文件内容

在网上找到的PropertiesUtil类,继承properties并改写其中方法

package com.itheima.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.itheima.factory;

import com.itheima.util.OrderedProperties;

import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 一个创建bean对象的工厂
 * Bean:在计算机英语中,有可重用组件的含义
 * JavaBean:用java语言编写的可重用组件。
 *          javabean > 实体类
 *
 *      它就是创建我们的service和dao对象的
 *
 *     第一个,需要一个配置文件来配置我们的service和dao
 *            配置的内容:唯一标识=全限定类名(key=value)
 *     第二个,通过读取配置文件中的配置内容,反射创建对象
 *
 *     配置文件可以是xml也可以是properties
 * @date 2021/3/7 - 1:43
 */
public class BeanFactory {
    //定义一个Properties对象
    private static Properties props;

    //定义一个Map,用于存放我们要创建的对象。我们把它称之为容器
    private static Map<String,Object> beans;

    //使用静态代码块为Properties对象赋值
    static {
        try {
            //实例化对象
            props = new OrderedProperties();
            //获取properties文件的流对象
            InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);
            //实例化容器
            beans = new HashMap<String,Object>();
            //取出配置文件中所有的Key
            Enumeration keys = props.keys();
            //遍历枚举
            while (keys.hasMoreElements()){
                //取出每个Key
                String key = keys.nextElement().toString();
                //根据key获取value
                String beanPath = props.getProperty(key);
                //反射创建对象
                Object value = Class.forName(beanPath).getConstructor().newInstance();
                //把key和value存入容器中
                beans.put(key,value);
            }
        }catch(Exception e){
            throw new ExceptionInInitializerError("初始化properties失败!");
        }
    }

    /**
     * 根据bean的名称获取对象
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName){
   
        return beans.get(beanName);
    }
}

补充一个有序写入properties方法

 /** 
   * 写Properties文件(有序) 
   */
  private static void writeOrderedPropertiesFile(Properties properties) { 
    properties.setProperty("phone", "10086"); 
    OutputStreamWriter outputStreamWriter = null; 
    try { 
      //保存属性到b.properties文件 
      FileOutputStream fileOutputStream = new FileOutputStream("order.properties", false);//true表示追加打开,false每次都是清空再重写 
      //prop.store(oFile, "此参数是保存生成properties文件中第一行的注释说明文字");//这个会两个地方乱码 
      //prop.store(new OutputStreamWriter(oFile, "utf-8"), "汉字乱码");//这个就是生成的properties文件中第一行的注释文字乱码 
      outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8"); 
      properties.store(outputStreamWriter, "lll"); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (outputStreamWriter != null) { 
        try { 
          outputStreamWriter.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
  
  }
posted @ 2021-03-07 14:32  AlexFung  阅读(390)  评论(0)    收藏  举报