按顺序读取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()); } } } }