【持续更新】几种java中读取配置文件的方法

时间:2024-03-21 18:28:46

 

背景:

         在开发过程中,经常会碰到需要用到读取配置文件内容从而达到目的,故在此列几种我自己用到过的读取方法,记录一下,也方便大家查阅方便。

 

情景:

         在使用过程中看情况使用,如果是springboot项目的话,最好直接用方法二,没有springboot可以用方法1结合方法3,将方法一中的

String str = "E:/ssl/ssl.properties";
in = new FileInputStream(str);

     替换为   

in = EppTransportTcpTlsImpl.class.getClassLoader().getResourceAsStream("ssl.properties");

        就不用担心项目移动导致路径变化,也能更方便的发布到服务器上而不用每次都要修改路径。

 

1.通常读取方法:

         需求:通过传入一个字符串,判断调用配置文件里面的哪些配置,并返回对应的map。

/**
 * 这个类提供将配置文件里面的属性根据传入的值提取到对应map里面的方法
 * @author Wzy525110
 */
public class PropertiesToMap {
    /**
     * 这个方法能将配置文件里面的属性根据传入的值提取到对应map里面
     * @param str1
     * @return
     */

    public Map<String,String> getProp(String str1) throws Exception{

        Properties pro = new Properties();
        //初始化
        FileInputStream in = null;
        //创建一个map,key存放配置文件属性的属性名,value存放配置文件属性的属性值
        Map<String,String> testMap = new HashMap<String, String>();
        try {
            //文件的路径及文件名
//            String str = "/usr/local/java/ssl.properties";

            String str = "E:/ssl/ssl.properties";
            in = new FileInputStream(str);
            //读取文件
            pro.load(in);
            //把文件里面的key(属性名)拿出来
            Iterator<String> it=pro.stringPropertyNames().iterator();
            //根据key去遍历
            while(it.hasNext()){
                //如果还有,就给这个key一个值
                String key=it.next();
                //判断这个值是否包含传进来的字符串的值,包含为1,不包含为-1
                if (key.indexOf(str1) != -1){

                    //找到这个key对应的属性
                    String value=pro.getProperty(key);
                    //把遍历的结果放入map里面
                    testMap.put(key,value);}
            }

        } catch (FileNotFoundException e) {
            throw new FileNotFoundException("找不到文件FileNotFoundException,"+this.getClass().getName());
        } catch (IOException e) {
            throw new IOException("IOException,"+this.getClass().getName());
        }finally {
            if(in !=null){
                try {
                    //最后关闭读取
                    in.close();
                } catch (IOException e) {
                    throw new IOException("IOException,"+this.getClass().getName());
                }
            }
        }
        //返回这个map集合
        return testMap;
    }
}

 

 

 

2.Springboot中读取配置文件:

首先声明一点,springboot获取资源文件,需要看是

  1》从spring boot默认的application.properties资源文件中获取

  2》还是从自定义的资源文件中获取

带着这个想法去看下面几种方式

原文链接,作者写的相当详细,本文仅未引用代码部分

【spring Boot】spring boot获取资源文件的三种方式【两种情况下】

  https://www.cnblogs.com/sxdcgaq8080/p/7659074.html

===============================================================================================

1》从spring boot默认的application.properties资源文件中获取

先给出来application.properties的内容

【持续更新】几种java中读取配置文件的方法

 

①===第一种方式:使用@ConfigurationProperties获取配置文件

先搞一个绑定资源文件的bean

【持续更新】几种java中读取配置文件的方法

注意属性名和资源文件中的属性名相一致。

然后在启动类中使用

【持续更新】几种java中读取配置文件的方法

 

 

结果如下:

控制台打印:

【持续更新】几种java中读取配置文件的方法

访问地址:

【持续更新】几种java中读取配置文件的方法

 

②===第二种方式:使用@Value获取配置文件

这里不用搞一个绑定资源文件的bean了。

只需要在你想用的地方使用@Value调用你想要的属性名对应的值即可。

【持续更新】几种java中读取配置文件的方法

 

访问结果:

【持续更新】几种java中读取配置文件的方法

 

③===第三种方式:使用Environment获取资源文件

也不用提前做什么使用,Environment就是一个全局的资源池,application.properties中的属性值都可以从这里获取到。

【持续更新】几种java中读取配置文件的方法

 

运行结果:

【持续更新】几种java中读取配置文件的方法

================================================================================================

2》从自定义的资源文件中获取属性值

①===第一种方式:使用@ConfigurationProperties获取配置文件

 自定义资源文件如下:

【持续更新】几种java中读取配置文件的方法

然后指定绑定自定义资源文件

【持续更新】几种java中读取配置文件的方法

 

最后在启动类中使用一下

【持续更新】几种java中读取配置文件的方法

 

运行结果:

【持续更新】几种java中读取配置文件的方法

 

②===第二种方式:使用@Value获取配置文件

先设定一个自定义资源文件

如下,自定义资源文件需要满足application-{profile}.properties格式

【持续更新】几种java中读取配置文件的方法

 

然后在application.properties文件中指明加载这个资源文件

spring.profiles.active=test
#spring.profiles.include=test

这两种哪种都可以加载上自定义的资源文件,后面的test就是上面{profile}的值

【持续更新】几种java中读取配置文件的方法

 

 最后在启动类中使用@Value获取自定义资源文件中的属性,这个时候自定义的资源文件已经在application,properties文件中被指明要被加载了,因此是可以被获取到的

【持续更新】几种java中读取配置文件的方法

 

 

运行结果:

【持续更新】几种java中读取配置文件的方法

③===第三种方式:使用Environment获取资源文件

 

 首先还是写一个自定义的资源文件,文件命名同上面第二种方式一样

【持续更新】几种java中读取配置文件的方法

接着,在application.properties中声明加载这个自定义的资源文件

【持续更新】几种java中读取配置文件的方法

最后在启动类中,也就是哪里使用就在那里自动注入Environment.

【持续更新】几种java中读取配置文件的方法

 

 

3.java配置文件的读取写入的解决方案(getResourceAsStream的用法)

原文链接,作者写的相当详细,本文仅未引用代码部分

java配置文件的读取写入的解决方案(getResourceAsStream的用法)

https://blog.csdn.net/cyxinda/article/details/78254057

===============================================================================================

 

1,首先,Java中的getResourceAsStream有以下几种: 
        1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 

        2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。 

        3. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。 

        4. Jsp下的application内置对象就是上面的ServletContext的一种实现。 

其次,getResourceAsStream 用法大致有以下几种: 

第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml 

那么,应该有如下代码: 

me.class.getResourceAsStream("myfile.xml"); 

第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml 

那么,应该有如下代码: 

me.class.getResourceAsStream("file/myfile.xml"); 

第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml 

那么,应该有如下代码: 

me.class.getResourceAsStream("/com/x/file/myfile.xml"); 

总结一下,可能只是两种写法 

第一:前面有 “   / ” 

“ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject 

me.class.getResourceAsStream("/com/x/file/myfile.xml"); 

第二:前面没有 “   / ” 

代表当前类的目录 

me.class.getResourceAsStream("myfile.xml"); 

me.class.getResourceAsStream("file/myfile.xml"); 

最后,自己的理解: 
getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
配置文件读取:

private static Properties properties = new Properties();
properties.load(getClass().getResourceAsStream(conifgName));
String value = properties.getString(key);
1,首先,Java中的getResourceAsStream有以下几种: 
/**
     * 修改某个属性
     * @param key 修改的属性名
     * @param value  修改的属性值
     * @return
     */
    public static String setString(String key, String value) {
        OutputStream fos = null;
        try {
            fos = new FileOutputStream(Object.class.getResource(conifgName).getFile());
            if (value == null || "".equals(value)) {
                return null;
            }
            if (null == instance) {
                getInstance();
            }
            properties.setProperty(key, value);

            // 保存,并加入注释
            properties.store(fos, "Update '" + key + "'111111 value");

            return properties.getProperty(key);
        } catch (Exception e) {
            log.error("set properties error:(key->" + key + ",value->" + value + ")", e);
            e.printStackTrace();
            return null;
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }