2018-10-15 · Develop

Java 配置文件-ConfigUtil

使用配置文件,可以在不重新编译程序的情况下,通过修改配置文件,改变程序中用到的一些资源。如程序运行时用到的外部文件的路径、数据库连接字串和一些常量文本等

本文讲述使用 Java 读取配置文件。

创建个配置工具类

配置文件的工具类可以像 java.lang.Math 的工具包一样提供静态方法访问,也可以提供单例模式的方法方式,本文不讨论静态方法和单例模式的使用场景。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConfigUtil {

    private static final Logger log = LoggerFactory.getLogger(ConfigUtil.class);

    private Properties properties;

    private ConfigUtil() {
        properties = new Properties();
    }

    private static class ConfigUtilBuilder {
        private static ConfigUtil instance = new ConfigUtil();
    }

    public static ConfigUtil getInstance() {
        return ConfigUtilBuilder.instance;
    }
}

获取配置文件

在工具类中使用 Properties 对象来存储 properties 的配置。

而 Perperties 的主要方法:

public synchronized void load(Reader reader) throws IOException

public synchronized void load(InputStream inStream) throws IOException

知道我们只需要获取到配置文件的流就可以读取配置了,根据不通的场景获取文件的方式很多,最常用的就是通过 ClassLoader 进行获取

InputStream is = ConfigUtil.class.getClassLoader().getResourceAsStream("conf.properties");

主意:

此处注意区别 .class.getClassLoader().getResourceAsStream().class..getResourceAsStream() 的区别,你可以自己实验一下

System.out.println(ConfigUtil.class.getResource(""));
System.out.println(ConfigUtil.class.getResource("/"));
System.out.println(ConfigUtil.class.getClassLoader().getResource(""));
System.out.println(ConfigUtil.class.getClassLoader().getResource("/"));

输出如下

file:/D:/IdeaProjects/Test/target/classes/com/example/util/
file:/D:/IdeaProjects/Test/target/classes/
file:/D:/IdeaProjects/Test/target/classes/
null

加载配置项

加载配置项就很简单使用上面的 load 就可以了

public void loadProperties(String name) {
    InputStream is = ConfigUtil.class.getClassLoader().getResourceAsStream(name);
    try {
        properties.load(is);
    } catch (IOException e) {
        // this is never happen
        log.error(String.format("Load properties file [%s] on error", name), e);
    }
}

增加调用的函数

public String getString(String key) {
    return properties.getProperty(key);
}

public String getString(String key, String defaultValue) {
    String value = properties.getProperty(key);
    return StringUtil.isEmpty(value) ? defaultValue : value;
}

根据实际情况,考虑系统变量重写配置信息

如果要将配置做的灵活一点的话,可以首先获取系统变量,如果系统变量不存在的情况下再去读取配置文件,比如:

public String getString(String key) {
    String value = System.getProperty(key);
    return StringUtil.isEmpty(value) ? properties.getProperty(key) : value;
}