java学习-配置文件加载

Posted 懒佯佯大哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java学习-配置文件加载相关的知识,希望对你有一定的参考价值。

介绍

  • 背景:在java开发中,往往需要自己定义配置文件、解析方式
  • java类中,进行配置文件加载的类是:Properties
    • Properties的是一个持久的属性值,可保存在流中,或者从流中加载。配置里的每个键值对,都是String类型
    • Properties是一个线程安全的类,多个线程可共享同一个Properties对象:因为load和set操作,使用了syncronized修饰

加载方式:

  • 方式1:文件系统加载
  • 方式2:类加载器加载
  • 方式3【第三方库,这里不做介绍】:使用apache的配置包:org.apache.commons.configuration
  • 方式4:使用注解方式,待完成!!!
  • 示例:
    • 创建配置文件1:ref2.properties,放入到工程的resources目录下:
    cat=reflect2.Cat
    bird=reflect2.Bird
    
    • 创建配置文件2:ref2.yaml,放入到工程的resources目录下:
    cat: reflect2.Cat
    bird: reflect2.Bird
    
    • 创建测试代码:
        class Main1 
    
        public static void main(String[] args) throws IOException 
            // 方式1:文件系统加载:
            // 问题:文件系统加载的时候,不容易找到配置文件的路径
            System.out.println("################### 方式1:文件系统加载: ###################");
            FileInputStream fis1 = new FileInputStream(
                    "/Users/zhaoyue/codes/springAopMaven/src/main/resources/ref2.properties");
            Properties p1 = new Properties();
            p1.load(fis1);
            System.out.println("获取cat的value:" + p1.getProperty("cat"));
    
            FileInputStream fis2 = new FileInputStream(
                    "/Users/zhaoyue/codes/springAopMaven/src/main/resources/ref2.yaml");
            Properties p2 = new Properties();
            p2.load(fis2);
            System.out.println("获取bird的value:" + p2.getProperty("bird"));
    
            // 方式2:通过类加载器
            // 一般情况下,配置文件都放置在:resources目录下
            System.out.println("################### 方式2:通过类加载器: ###################");
            InputStream resourceAsStream = Main1.class.getClassLoader().getResourceAsStream("ref2.properties");
            Properties p3 = new Properties();
            p3.load(resourceAsStream);
            System.out.println("获取bird的value:" + p3.getProperty("bird"));
        
    
    
    • 结果说明:
      不论是properties还是yaml文件,Properties都可进行加载、解析
      通常情况下,优先推荐使用类加载器方式加载配置文件

Properties类:

  • 属性:
    protected Properties defaults;

  • 构造方法:
    public Properties()
    Public Properties(Properties defaults)

  • 加载配置:
    public synchronized void load(Reader reader) throws IOException // 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
    public synchronized void load(InputStream inStream) throws IOException // 从输入流中读取属性列表(键和元素对)。

  • 获取配置:
    public String getProperty(String key) // 用指定的键在此属性列表中搜索属性
    public String getProperty(String key, String defaultValue) // 用指定的键在属性列表中搜索属性,不存在时设置默认值
    public Enumeration<?> propertyNames() // 返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
    public Set stringPropertyNames() // 返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键

  • 修改配置:线程安全
    public synchronized Object setProperty(String key, String value) // 调用 Hashtable 的方法 put。

  • 保存配置:
    public void save(OutputStream out, String comments) // 已废弃,不用care
    public void store(Writer writer, String comments) throws IOException // 以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
    public void store(OutputStream out, String comments) throws IOException // 以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流
    public synchronized void loadFromXML(InputStream in) throws IOException, InvalidPropertiesFormatException // 将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
    public void storeToXML(OutputStream os, String comment) throws IOException // 发出一个表示此表中包含的所有属性的 XML 文档。
    public void storeToXML(OutputStream os, String comment, String encoding) throws IOException // 使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
    public void list(PrintStream out) // 将属性列表输出到指定的输出流。
    public void list(PrintWriter out) // 将属性列表输出到指定的输出流。

  • 匿名内部类:
    class LineReader:用于读取配置文件中的每一行
    private static class XmlSupport : Xml解析的支持


  • 简单的使用(保存配置相关这里不做介绍)
        // 方式2:通过类加载器
        // 一般情况下,配置文件都放置在:resources目录下
        System.out.println("################### 方式2:通过类加载器: ###################");
        InputStream resourceAsStream = Main1.class.getClassLoader().getResourceAsStream("ref2.properties");
        Properties p3 = new Properties();
        p3.load(resourceAsStream);
        System.out.println("获取bird的value:" + p3.getProperty("bird"));

        System.out.println("################### 测试get方法 ###################");
        System.out.println("获取birdsss的value(默认为null):" + p3.getProperty("birdsss"));
        System.out.println("获取birdsss的value(可传入默认值):" + p3.getProperty("birdsss", "Nothing"));

        System.out.println("################### 打印所有的属性值 ###################");
        System.out.println("方式1:通过枚举值获取");
        Enumeration<?> enumeration = p3.propertyNames();    // 可火速所有的属性值
        while (enumeration.hasMoreElements()) 
            System.out.println(enumeration.nextElement());
        
        System.out.println("方式2:set<String>集合");
        System.out.println(p3.stringPropertyNames());

        System.out.println("################### 修改属性值 ###################");
        p3.setProperty("cat", "NoCat");
        System.out.println("修改后的cat为:" + p3.getProperty("cat"));

  • 输出:
################### 方式2:通过类加载器: ###################
获取bird的value:reflect2.Bird
################### 测试get方法 ###################
获取birdsss的value(默认为null):null
获取birdsss的value(可传入默认值):Nothing
################### 打印所有的属性值 ###################
方式1:通过枚举值获取
cat
bird
方式2:set<String>集合
[cat, bird]
################### 修改属性值 ###################
修改后的cat为:NoCat
  • 除了自身去load之外,还可以调用System.getProperties()
        System.out.println("################### 获取系统的属性值 ###################");
        Properties p4 = System.getProperties();
        System.out.println(p4.stringPropertyNames());

输出:可以看到,打印了java运行时的所有入参

################### 获取系统的属性值 ###################
[java.runtime.name, sun.boot.library.path, java.vm.version, gopherProxySet, java.vm.vendor, java.vendor.url, path.separator, java.vm.name, file.encoding.pkg, user.country, sun.java.launcher, sun.os.patch.level, java.vm.specification.name, user.dir, java.runtime.version, java.awt.graphicsenv, java.endorsed.dirs, os.arch, java.io.tmpdir, line.separator, java.vm.specification.vendor, os.name, sun.jnu.encoding, java.library.path, java.specification.name, java.class.version, sun.management.compiler, os.version, user.home, user.timezone, java.awt.printerjob, file.encoding, java.specification.version, user.name, java.class.path, java.vm.specification.version, sun.arch.data.model, java.home, sun.java.command, java.specification.vendor, user.language, awt.toolkit, java.vm.info, java.version, java.ext.dirs, sun.boot.class.path, java.vendor, file.separator, java.vendor.url.bug, sun.cpu.endian, sun.io.unicode.encoding, sun.cpu.isalist]


其它

  • 参考1:https://www.jianshu.com/p/efdd1a526939
  • 参考2:https://tool.oschina.net/apidocs/apidoc?api=jdk-zh
  • 参考3:https://www.iteye.com/blog/liuzidong-831440

以上是关于java学习-配置文件加载的主要内容,如果未能解决你的问题,请参考以下文章

ServletContainerInitializer加载机制

java spring 获取配置文件,并放入一个list 对象中

蜡炬教育:如何处理机器学习中大型数据的加载问题?

Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解

Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解

Java基础学习总结(196)—— JavaSpringDubbo 三种 SPI 机制详解