精华内容
下载资源
问答
  • Shell脚本读取配置文件

    万次阅读 多人点赞 2019-07-06 00:12:55
    Shell脚本读取配置文件 这里参考了下面这篇博客 https://blog.csdn.net/liubeck/article/details/7497156 不过按照上面的代码我的无法正确运行,又去查了半天才搞明白里面的问题。 配置文件为myconfig.ini ...

    Shell脚本读取配置文件

    这里参考了下面这篇博客
    https://blog.csdn.net/liubeck/article/details/7497156
    不过按照上面的代码好像有点问题,后来搞了半天实现了需求。
    配置文件为myconfig.ini

    [Class]
    ids=student1,student2,student3
    files=profilefile
     
    [student1]
    name=LiLei
    age=16
     
    [student2]
    name=HanMeiMei
    age=15
     
    [student3]
    name=Lucy
    age=15
    
    

    如何取[student1]下面name的值呢?用下面这行代码:

    awk -F '=' '/\[student1\]/{a=1}a==1&&$1~/name/{print $2;exit}' myconfig.ini 
    

    这句指令涉及到的内容挺多的,查了半天才搞明白,详细解释一下:

    1. 首先这句指令用了awk命令,awk命令通常是将所列出的行,根据条件打印出某一列或几列,想多了解的话可以参考下网上资料
      https://www.cnblogs.com/ftl1012/p/9250541.html

    2. “-F” 是awk命令的一个选项,用来指定后面记录(行)的分隔符号,就是确定用什么作为分隔符号把记录分成一个一个的域,这里后面跟的 ‘=’ 表示用等号来分隔。

    3. 再往后单引号中间是awk命令,awk命令由模式和动作组成,模式是一组用来测试输入行是否需要执行动作的规则,动作是包含语句、函数和表达式的执行过程,简单来说就是模式决定动作何时触发和触发事件,动作执行对输入行的处理。

    4. / \ [student1 \ ]/ 这就是上面说的awk命令的模式,模式与动作之间用 / 来分开,表示匹配到这个模式的话执行后面的动作,这里要匹配的是 [strudent1] ,因为方括号[ ] 在shell中有特殊的意义,使用转义符号\ 表示单纯的 [ ] 符号,所以这里就是[strudent1] 。

    5. {a=1} 花括号里面的内容是awk命令的动作,这里就是给a赋值为1.

    6. a==1&&$1~/name/ 这里又是一个模式匹配,先是判断a是否等于1(因为刚才已经给a赋值为1,所以这里肯定相等),还要$1~/name/,$1表示第一域,就是字符串用分隔符号分割后的第一段, ~ 符号在awk命令中是关系运算符号,表示匹配正则表达式,这里就是要第一域为name

    7. {print $2;exit} 这里又是一个动作,打印第二域,即第一域name的取值,然后退出awk命令。

    8. myconfig.ini 当然表示对 myconfig.ini 文件的操作。
      这句话整体的含义就是: 对 myconfig.ini 文件进行操作,用=对每一行进行分割,找到匹配[student1]的section,再从 [student1] 下面找到name这一opiton,最后打印option的取值。

    有了这句话,现在就可以使用shell脚本对 myconfig.ini 文件进行操作了:
    configOperate.sh

    #!/bin/bash
    getconfig()
    {
      Section=$1  #传递的第一个参数
      ConFile=$2  #传递的第二个参数
      Options="name\tage\t"
      echo $Options|tr '\\t' '\t'
      for loop in $(echo $Options|tr '\\t' ' ') #tr替换命令
      do
           #{gsub(/[[:blank:]]*/,"",$2)去除值两边的空格内容
           awk -F '=' '/\['"$Section"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t\t",$2) ;exit}' $ConFile
      done
    }
    
    #更改变量名称
    CONFIGFILE=$1
    #文件名称
    echo -e "ConfigName:$CONFIGFILE \n"
    #取得ids中的每个id把,号分隔改成空格,因为循环内容要以空格分隔开来
    profile=`sed -n '/ids/'p $CONFIGFILE | awk -F=  '{print $2}' | sed 's/,/ /g'`
    #对于一个配置文件中的所有id循环
    for stdudent in $profile
    do
      echo "--------------------------------------------------"
      echo "student:$stdudent"
      getconfig  $stdudent  $CONFIGFILE
      echo -e "\n"
    done
    

    脚本的解释:
    首先定义了getconfig()函数,用来将选定的section中的每个option以及取值打印出来。其中的$1、$2是调用函数时传递给它的第一个和第二个参数。

    下面两句

      Options="name\tage\t"
      echo $Options|tr '\\t' '\t'
    

    这两句是为了打印两个option :name和age

    tr '\\t' '\t'
    

    tr命令用于替换,这里是将 \t 这两个普通符号替换成了制表符号tab,注意\t的用法,因为\符号除了是一个普通符号之外还表示转义字符,所以用转义字符 \ 将它本身转化视作一个普通的符号。
    这两句的结果是输出

    name		age	
    

    下面一句

      for loop in $(echo $Options|tr '\\t' ' ') 
    

    这句的意思就是循环中让loop分别取name和age
    也可以这样写

      for loop in name age
    

    但是不能用

      for loop in `echo $Options|tr '\\t' ' '`  # ` 执行符号
    

    虽然在这句话中能实现的作用一样,但是放到整个脚本中却会有问题,不清楚为什么。

    有了之前的解释,这一句

    awk -F '=' '/\['"$Section"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t\t",$2) ;exit}' $ConFile
    

    就好理解了,不同之除就是如果用变量来代替student1…的话,格式是 ‘"$Section"’,先双引号,再单引号,gsub(/[[:blank:]]*/,"",$2) 去除值两边的空格内容,printf 是格式化输出。
    以上是定义的getconfig函数。

    下面需要解释的是

    profile=`sed -n '/ids/'p $CONFIGFILE | awk -F=  '{print $2}' | sed 's/,/ /g'`
    

    执行符号` 表示将里面命令运行的结果赋值给变量

    sed -n '/ids/'p $CONFIGFILE 
    

    是sed命令的一种用法,表示读取文件中匹配ids的行,具体可以参考
    https://www.cnblogs.com/ctaixw/p/5860221.html

     awk -F=  '{print $2}' 
    

    用=将这一行分割,打印第二部分,即 student1,student2,student3

    sed 's/,/ /g'
    

    将逗号替换为空格
    下面的内容相对简单, 主要是函数的调用方法为

     getconfig  $stdudent  $CONFIGFILE
    

    最后的运行结果:

    mk90@mk90-e420:~/Documents/myshell$ ./configOperate.sh myconfig.ini ConfigName:myconfig.ini 
    
    --------------------------------------------------
    student:student1
    name		age		
    LiLei		16		
    
    --------------------------------------------------
    student:student2
    name		age		
    HanMeiMei		15		
    
    --------------------------------------------------
    student:student3
    name		age		
    Lucy		15		
    
    
    
    
    展开全文
  • springmvc读取配置文件

    千次阅读 2018-07-16 18:12:57
    springmvc读取配置文件 工具类 简单的工具类 PropertiesUtil package com.mavenssmlr.util; import java.io.InputStream; import java.util.Properties; /** * 读取配置文件工具类 * Created by ...

    springmvc读取配置文件

    工具类

    简单的工具类

    PropertiesUtil

    package com.mavenssmlr.util;
    
    import java.io.InputStream;
    import java.util.Properties;
    
    /**
     * 读取配置文件工具类
     * Created by shirukai on 2017/12/18.
     */
    public class PropertiesUtil {
        private static Properties getProperties(String properties) {
            try {
                InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(properties);
                Properties p = new Properties();
                p.load(in);
                return p;
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        public static String getValue(String properties,String key){
            Properties p = getProperties(properties);
            return p.getProperty(key);
        }
    }

    配置文件

    在resource目录下创建config.properties文件

    test="this is test !"

    测试类

    package com.mavenssmlr.util;
    
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    /**
     *
     * Created by shirukai on 2017/12/18.
     */
    public class PropertiesUtilTest {
        @Test
        public void getValue() throws Exception {
            System.out.println(PropertiesUtil.getValue("config.properties","test"));
        }
    
    }

    多功能读取配置文件的工具类

    package com.inspur.tax.common.util;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.NoSuchElementException;
    import java.util.Properties;
    
    import org.springframework.core.io.DefaultResourceLoader;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.ResourceLoader;
    
    public class PropertiesLoader {
        private static ResourceLoader resourceLoader = new DefaultResourceLoader();
    
        private final Properties properties;
    
        public PropertiesLoader(String... resourcesPaths) {
            properties = loadProperties(resourcesPaths);
        }
    
        public Properties getProperties() {
            return properties;
        }
    
        /**
         * 取出Property,但以System的Property优先.取不到返回空字符串
         *
         * @param key Property键
         * @return String类型的Property值
         * @since 2016年9月21日 下午3:46:33
         */
        private String getValue(String key) {
            String systemProperty = System.getProperty(key);
            if (systemProperty != null) {
                return systemProperty;
            }
            if (properties.containsKey(key)) {
                return properties.getProperty(key);
            }
            return "";
        }
    
        /**
         * 取出String类型的Property,但以System的Property优先,如果都为Null则抛出异常
         *
         * @param key Property键
         * @return String类型的Property值
         * @since 2016年9月21日 下午3:51:45
         */
        public String getProperty(String key) {
            String value = getValue(key);
            if (value == null) {
                throw new NoSuchElementException();
            }
            return value;
        }
    
        /**
         * 取出String类型的Property,但以System的Property优先.如果都为Null则返回Default值
         *
         * @param key          Property键
         * @param defaultValue Default值
         * @return String类型的Property值
         * @since 2016年9月21日 下午3:52:35
         */
        public String getProperty(String key, String defaultValue) {
            String value = getValue(key);
            return value != null ? value : defaultValue;
        }
    
        /**
         * 取出Integer类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常
         *
         * @param key Property键
         * @return Integer类型的Property值
         * @since 2016年9月21日 下午3:53:27
         */
        public Integer getInteger(String key) {
            String value = getValue(key);
            if (value == null) {
                throw new NoSuchElementException();
            }
            return Integer.valueOf(value);
        }
    
        /**
         * 取出Integer类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
         *
         * @param key          Property键
         * @param defaultValue Default值
         * @return Integer类型的Property值
         * @since 2016年9月21日 下午3:54:00
         */
        public Integer getInteger(String key, Integer defaultValue) {
            String value = getValue(key);
            return value != null ? Integer.valueOf(value) : defaultValue;
        }
    
        /**
         * 取出Long类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常
         *
         * @param key Property键
         * @return Long类型的Property值
         * @since 2016年9月21日 下午3:54:35
         */
        public Long getLong(String key) {
            String value = getValue(key);
            if (value == null) {
                throw new NoSuchElementException();
            }
            return Long.valueOf(value);
        }
    
        /**
         * 取出Long类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
         *
         * @param key          Property键
         * @param defaultValue Default值
         * @return Long类型的Property值
         * @since 2016年9月21日 下午3:55:17
         */
        public Long getLong(String key, Long defaultValue) {
            String value = getValue(key);
            return value != null ? Long.valueOf(value) : defaultValue;
        }
    
        /**
         * 取出Double类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常
         *
         * @param key Property键
         * @return Double类型的Property值
         * @since 2016年9月21日 下午3:43:55
         */
        public Double getDouble(String key) {
            String value = getValue(key);
            if (value == null) {
                throw new NoSuchElementException();
            }
            return Double.valueOf(value);
        }
    
        /**
         * 取出Double类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
         *
         * @param key          Property键
         * @param defaultValue Default值
         * @return Double类型的Property值
         * @since 2016年9月21日 下午3:45:28
         */
        public Double getDouble(String key, Integer defaultValue) {
            String value = getValue(key);
            return value != null ? Double.valueOf(value) : defaultValue;
        }
    
        /**
         * 取出Boolean类型的Property,但以System的Property优先.如果都为Null抛出异常,如果内容不是true/
         * false则返回false
         *
         * @param key Property键
         * @return Boolean类型的Property值
         * @since 2016年9月21日 下午3:49:43
         */
        public Boolean getBoolean(String key) {
            String value = getValue(key);
            if (value == null) {
                throw new NoSuchElementException();
            }
            return Boolean.valueOf(value);
        }
    
        /**
         * 取出Boolean类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容不为true/
         * false则返回false
         *
         * @param key          Property键
         * @param defaultValue Default值
         * @return Boolean类型的Property值
         * @since 2016年9月21日 下午3:48:32
         */
        public Boolean getBoolean(String key, boolean defaultValue) {
            String value = getValue(key);
            return value != null ? Boolean.valueOf(value) : defaultValue;
        }
    
        /**
         * 载入多个文件,文件路径使用Spring Resource格式
         *
         * @param resourcesPaths 文件路径
         * @return Properties
         * @since 2016年9月21日 下午3:48:12
         */
        private Properties loadProperties(String... resourcesPaths) {
            Properties props = new Properties();
    
            for (String location : resourcesPaths) {
                InputStream is = null;
                try {
                    Resource resource = resourceLoader.getResource(location);
                    is = resource.getInputStream();
                    props.load(is);
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    // IOUtils.closeQuietly(is);
                }
            }
            return props;
        }
    }
    
    展开全文
  • 10分钟搞定 SpringBoot 如何优雅读取配置文件

    千次阅读 多人点赞 2020-02-09 11:19:56
    本文以及收录自springboot-guide(不只是SpringBoot还有Spring重要知识点),地址:...很多时候我们需要将一些常用的配置信息比如阿里云 oss 配置、发送短信的相关信息配置等等放到配置文件中。 ...

    本文以及收录自springboot-guide(不只是SpringBoot还有Spring重要知识点),地址:https://github.com/Snailclimb/springboot-guide 。让你学习 Spring 变的更加容易!如果觉得不错的话,欢迎去点个 Star!

    很多时候我们需要将一些常用的配置信息比如阿里云 oss 配置、发送短信的相关信息配置等等放到配置文件中。

    下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。

    application.yml 内容如下:

    wuhan2020: 2020年初武汉爆发了新型冠状病毒,疫情严重,但是,我相信一切都会过去!武汉加油!中国加油!
    
    my-profile:
      name: Guide哥
      email: koushuangbwcx@163.com
    
    library:
      location: 湖北武汉加油中国加油
      books:
        - name: 天才基本法
          description: 二十二岁的林朝夕在父亲确诊阿尔茨海默病这天,得知自己暗恋多年的校园男神裴之即将出国深造的消息——对方考取的学校,恰是父亲当年为她放弃的那所。
        - name: 时间的秩序
          description: 为什么我们记得过去,而非未来?时间“流逝”意味着什么?是我们存在于时间之内,还是时间存在于我们之中?卡洛·罗韦利用诗意的文字,邀请我们思考这一亘古难题——时间的本质。
        - name: 了不起的我
          description: 如何养成一个新习惯?如何让心智变得更成熟?如何拥有高质量的关系? 如何走出人生的艰难时刻?
    

    1.通过 @value 读取比较简单的配置信息

    使用 @Value("${property}") 读取比较简单的配置信息:

    @Value("${wuhan2020}")
    String wuhan2020;

    需要注意的是 @value这种方式是不被推荐的,Spring 比较建议的是下面几种读取配置信息的方式。

    2.通过@ConfigurationProperties读取并与 bean 绑定

    LibraryProperties 类上加了 @Component 注解,我们可以像使用普通 bean 一样将其注入到类中使用。

    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    @Component
    @ConfigurationProperties(prefix = "library")
    @Setter
    @Getter
    @ToString
    class LibraryProperties {
        private String location;
        private List<Book> books;
    
        @Setter
        @Getter
        @ToString
        static class Book {
            String name;
            String description;
        }
    }
    

    这个时候你就可以像使用普通 bean 一样,将其注入到类中使用:

    package cn.javaguide.readconfigproperties;
    
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author shuang.kou
     */
    @SpringBootApplication
    public class ReadConfigPropertiesApplication implements InitializingBean {
    
        private final LibraryProperties library;
    
        public ReadConfigPropertiesApplication(LibraryProperties library) {
            this.library = library;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ReadConfigPropertiesApplication.class, args);
        }
    
        @Override
        public void afterPropertiesSet() {
            System.out.println(library.getLocation());
            System.out.println(library.getBooks());    }
    }

    控制台输出:

    湖北武汉加油中国加油
    [LibraryProperties.Book(name=天才基本法, description........]

    3.通过@ConfigurationProperties读取并校验

    我们先将application.yml修改为如下内容,明显看出这不是一个正确的 email 格式:

    my-profile:
      name: Guide哥
      email: koushuangbwcx@

    ProfileProperties 类没有加 @Component 注解。我们在我们要使用ProfileProperties 的地方使用@EnableConfigurationProperties注册我们的配置 bean:

    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.annotation.Validated;
    
    import javax.validation.constraints.Email;
    import javax.validation.constraints.NotEmpty;
    
    /**
    * @author shuang.kou
    */
    @Getter
    @Setter
    @ToString
    @ConfigurationProperties("my-profile")
    @Validated
    public class ProfileProperties {
       @NotEmpty
       private String name;
    
       @Email
       @NotEmpty
       private String email;
    
       //配置文件中没有读取到的话就用默认值
       private Boolean handsome = Boolean.TRUE;
    
    }

    具体使用:

    package cn.javaguide.readconfigproperties;
    
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    
    /**
     * @author shuang.kou
     */
    @SpringBootApplication
    @EnableConfigurationProperties(ProfileProperties.class)
    public class ReadConfigPropertiesApplication implements InitializingBean {
        private final ProfileProperties profileProperties;
    
        public ReadConfigPropertiesApplication(ProfileProperties profileProperties) {
            this.profileProperties = profileProperties;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(ReadConfigPropertiesApplication.class, args);
        }
    
        @Override
        public void afterPropertiesSet() {
            System.out.println(profileProperties.toString());
        }
    }
    

    因为我们的邮箱格式不正确,所以程序运行的时候就报错,根本运行不起来,保证了数据类型的安全性:

    Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'my-profile' to cn.javaguide.readconfigproperties.ProfileProperties failed:
    
        Property: my-profile.email
        Value: koushuangbwcx@
        Origin: class path resource [application.yml]:5:10
        Reason: must be a well-formed email address

    我们把邮箱测试改为正确的之后再运行,控制台就能成功打印出读取到的信息:

    ProfileProperties(name=Guide哥, email=koushuangbwcx@163.com, handsome=true)

    4.@PropertySource读取指定 properties 文件

    import lombok.Getter;
    import lombok.Setter;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Component;
    
    @Component
    @PropertySource("classpath:website.properties")
    @Getter
    @Setter
    class WebSite {
        @Value("${url}")
        private String url;
    }

    使用:

    @Autowired
    private WebSite webSite;
    
    System.out.println(webSite.getUrl());//https://javaguide.cn/
    

    5.题外话:Spring 加载配置文件的优先级

    Spring 读取配置文件也是有优先级的,直接上图:

    更对内容请查看官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

    本文源码:https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/read-config-properties

    开源项目推荐

    作者的其他开源项目推荐:

    1. JavaGuide:【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。
    2. springboot-guide : 适合新手入门以及有经验的开发人员查阅的 Spring Boot 教程(业余时间维护中,欢迎一起维护)。
    3. programmer-advancement : 我觉得技术人员应该有的一些好习惯!
    4. spring-security-jwt-guide :从零入门 !Spring Security With JWT(含权限验证)后端部分代码。

    公众号

    展开全文
  • 1.ServletContext方式 采用ServletContext读取配置文件realpath,然后通过文件流读出来。 优点:可以读取任意位置的文件 采用文件流读取,所以可以读取不同格式的文件 缺点:不能在servlet外面读取配置文件 ...

    1.ServletContext方式

        采用ServletContext读取配置文件realpath,然后通过文件流读出来。

        优点:可以读取任意位置的文件

                   采用文件流读取,所以可以读取不同格式的文件

        缺点:不能在servlet外面读取配置文件

        实现:

    package com.xunjie.common.utils;
    
    import java.io.FileInputStream;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Profile {
    	// 采用ServletContext读取配置文件的realpath,然后通过文件流读取出来
    	public void readProfileByServletContext(HttpServletRequest request, HttpServletResponse response) {
    		// 通过servletcontext读取到文件路径
    		String realPath = request.getServletContext().getRealPath("jdbc.properties");
    		//InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream
    		InputStreamReader reader;
    		//Properties类,主要用于读取Java的配置文件
    		Properties props = new Properties();
    		try {
    			// 建议使用Reader来读,因为reader体系中有个InputStreamReader可以指定编码
    			reader = new InputStreamReader(new FileInputStream(realPath), "utf-8");
    			// load ( InputStream inStream)方法
    			// 从输入流中读取属性列表(键和元素对)。 通过对指定的文件(比如说上面的jdbc.properties文件)进行装载来获取该文件中的所有键 - 值对。 以供 getProperty ( String key) 来搜索。
    			props.load(reader);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		// getProperty ( String key)方法,用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。
    		String jdbcUrl = props.getProperty("url");
    		System.out.println(jdbcUrl);
    		System.out.println(realPath);
    	}
    }
    

        使用Junit测试输出结果

        Junit使用参考:https://blog.csdn.net/qq_37725650/article/details/79409589

    package com.xunjie.test;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.mock.web.MockHttpServletRequest;
    import org.springframework.mock.web.MockHttpServletResponse;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.xunjie.common.utils.Profile;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:spring.xml" })
    public class ProfileTest {
    
    	private MockHttpServletRequest request;
    	private MockHttpServletResponse response;
    
    	@Before
    	public void setUp() {
    		request = new MockHttpServletRequest();
    		request.setCharacterEncoding("UTF-8");
    		response = new MockHttpServletResponse();
    	}
    
    	@Test
    	public void test() {
    		System.err.println("-----测试开始-start-----");
    		Profile profile = new Profile();
    		profile.readProfileByServletContext(request, response);
    		System.err.println("-----测试结束-end-----");
    	}
    }

    测试结果:

    -----测试开始-start-----
    jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8
    E:\WorkSpace\xunjie\xunjie\target\classes\jdbc.properties
    -----测试结束-end-----

    2.通过ResourceBundle类获取配置文件资源

        优点:1可以以全限定类名的方式加载资源2可以在非web应用里加载资源

        缺点:只能加载类下面的资源文件,且只能读取properties文件

    	/**
    	 * @Title: getProfileByResourceBundle
    	 * @Description: 通过ResourceBundle类获取配置文件资源
    	 * @param propertyName 配置文件名称
    	 * 调用方式:  
         * 1.配置文件放在resource源包下,不用加后缀  
         *  PropertiesUtil.getProfileByResourceBundle("message");  
         * 2.放在包里面的  
         *  PropertiesUtil.getProfileByResourceBundle("com.test.message");
    	 * @return Map<String,String> 以Map键值对方式返回配置文件内容
    	 */
    	public static Map<String, String> getProfileByResourceBundle(String propertyName) {
    		// 获得资源包
    		ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());
    		// 通过资源包拿到所有的key
    		Enumeration<String> allKey = rb.getKeys();
    		Map<String, String> profileMap = new HashMap<String, String>();
    		// 遍历key 得到 value
    		while (allKey.hasMoreElements()) {
    			String key = allKey.nextElement();
    			String value = (String) rb.getString(key);
    			//将文件内容存入map
    			profileMap.put(key, value);
    		}
    		return profileMap;
    	}

        测试运行结果:

    	public static void main(String[] args) {
    		//我的文件直接放在了src下,所以直接传入文件名称就可以了
    		Map<String, String> profileMap = Profile.getProfileByResourceBundle("jdbc");
    		String jdbcUrl = profileMap.get("url");
    		System.out.println(jdbcUrl);
    	}
    控制台输出:
    jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8
    3.通过ClassLoader方式进行读取
    /**
    	 * @Title: getProfileByClassLoader
    	 * @Description: 采用ClassLoader(类加载器)方式进行读取配置信息
    	 * @return Map<String,Object> 以Map键值对方式返回配置文件内容
    	 * 优点:可以在非Web应用中读取配置资源信息,可以读取任意的资源文件信息  
    	 * 缺点:只能加载类classes下面的资源文件
    	 * @throws
    	 */
    	public static Map<String, Object> getProfileByClassLoader() {
    		// 通过ClassLoader获取到文件输入流对象
    		// 配置文件放在resource源包下,直接写文件名即可,需要后缀名"jdbc.properties"
    		// 放在包里面的,需要写上包路径,例如:在test包下"com/test/jdbc.properties"),Profile为当前所在类类名
    		InputStream in = Profile.class.getClassLoader().getResourceAsStream("jdbc.properties");
    		// 获取文件的位置
    		String filePath = Profile.class.getClassLoader().getResource("jdbc.properties").getFile();
    		System.out.println(filePath);
    		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    		Properties props = new Properties();
    		Map<String, Object> profileMap = new HashMap<String, Object>();
    		try {
    			props.load(reader);
    			for (Object key : props.keySet()) {
    				profileMap.put(key.toString(), props.getProperty(key.toString()));
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return profileMap;
    	}

    测试运行结果:

    public static void main(String[] args) {
    		Map<String, Object> profileMap = Profile.getProfileByClassLoader();
    		System.out.println(profileMap.get("url"));
    	}
    控制台输出:
    /E:/WorkSpace/xunjie/xunjie/target/classes/jdbc.properties
    jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8

    4.使用Sping提供的PropertiesLoaderUtils类读取配置文件

        当然需要导入spring核心包

    /**
    	 * @Title: getProfileByPropertiesLoaderUtils
    	 * @Description: Spring 提供的 PropertiesLoaderUtils 允许您直接通过基于类路径的文件地址加载属性资源
    	 * 最大的好处就是:实时加载配置文件,修改后立即生效,不必重启 
    	 * @return Map<String,Object>
    	 */
    	public static Map<String, Object> getProfileByPropertiesLoaderUtils() {
    		Properties props = new Properties();
    		Map<String, Object> profileMap = new HashMap<String, Object>();
    		try {
    			props = PropertiesLoaderUtils.loadAllProperties("jdbc.properties");
    			for (Object key : props.keySet()) {
    				profileMap.put(key.toString(), props.getProperty(key.toString()));
    			}
    		} catch (IOException e) {
    			System.out.println(e.getMessage());
    		}
    		return profileMap;
    	}  

       测试运行结果:

    	public static void main(String[] args) {
    		Map<String, Object> profileMap = Profile.getProfileByPropertiesLoaderUtils();
    		System.out.println(profileMap.get("url"));
    	}
    控制台输出:
    jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8
    

    5.修改配置文件

    只是修改了classes下的文件,源文件并没有改变。

    	/**  
    	 * 传递键值对的Map,更新properties文件  
    	 *   
    	 * @param fileName  
    	 *            文件名(放在resource源包目录下),需要后缀  
    	 * @param keyValueMap  
    	 *            键值对Map  
    	 */
    	public static void updateProperties(String fileName, Map<String, String> keyValueMap) {
    		// 输入流
    		// InputStream
    		// inputStream=PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
    		// 获取文件的路径
    		String filePath = Profile.class.getClassLoader().getResource(fileName).getFile();
    		System.out.println("propertiesPath:" + filePath);
    		Properties props = new Properties();
    		BufferedReader br = null;
    		BufferedWriter bw = null;
    		try {
    			// 从输入流中读取属性列表(键和元素对)
    			br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
    			props.load(br);
    			br.close();
    			// 写入属性文件
    			bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)));
    			// 清空旧的文件
    			// props.clear();
    			for (String key : keyValueMap.keySet())
    				props.setProperty(key, keyValueMap.get(key));
    			props.store(bw, "改变数据");
    			System.out.println(props.getProperty("url"));
    			bw.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    			System.err.println("Visit " + filePath + " for updating " + "" + " value error");
    		} finally {
    			try {
    				br.close();
    				bw.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}

    修改前:


    运行测试结果即修改后:

    	public static void main(String[] args) {
    		Profile.updateProperties("jdbc.properties", new HashMap<String, String>() {
    			{
    				put("initialSize", "6");
    				put("test", "修改文件属性");
    			}
    		});
    	}


    展开全文
  • C#设置配置文件与读取配置文件

    千次阅读 2020-04-23 09:14:01
    第一步:新建项目,在项目的App.config中...第三步:在主程序中读取key,以及value; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ...
  • 如何在java代码中读取配置文件

    万次阅读 2018-08-25 16:01:14
    在日常开发过程中,我们经常需要拼接一些字符串...那我们可不可以换一种方式呢,答案是肯定的,我们可以将这些常量配置到配置文件中去,然后需要这些常量的地方直接去配置文件读取就行了,以后业务需求改变直接更...
  • C#读取XML配置文件

    2018-05-10 21:49:34
    C#读取XML配置文件 C#读取XML配置文件C#读取XML配置文件C#读取XML配置文件C#读取XML配置文件
  • Spring Boot读取配置文件的几种方式

    千次阅读 2020-07-07 18:38:00
    这三种注解可以配合着@PropertySource来使用,@PropertySource主要是用来指定具体的配置文件。 @PropertySource解析 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable...
  • spring读取配置文件的属性

    千次阅读 2019-06-20 10:07:55
    1.使用@Value(“${XXX.XXX}”) (1)spring 默认读取application....@Value("${token.valid-time:30}") :30表示配置文件未获取到值时,使用默认值30 protected Integer idTokenValidTime; (2)读取自定义配置文...
  • .net core自定义读取配置文件

    万次阅读 2019-02-25 14:51:30
    最近刚接触.net core 不久,对于ASP.NET Core的新的配置方式做个学习笔记,和之前版本的ASP.NET有很大的区别了,之前是依赖于System.Configuration和XML配置文件web.config,新的配置系统支持多种格式的配置文件。...
  • springboot读取配置文件的4种方式

    千次阅读 2019-08-14 23:39:23
    配置文件让项目开发、管理、后期维护变得更加的优雅便捷,所以我们有必要学习下常见的springboot读取配置文件的方式。首先新建一个springboot项目,在application.properties配置文件中添加如下属性。 ...
  • Python读取配置文件(config.ini),写入配置文件

    万次阅读 多人点赞 2018-10-23 22:18:58
    一、读取配置文件 我的目录如下,在config下有一个config.ini配置文件 配置文件内容 # 定义config分组 [config] platformName=Android appPackage=com.romwe appActivity=com.romwe.SplashActivity # 定义cmd...
  • 批处理读取配置文件

    千次阅读 2018-08-22 22:10:56
    配置文件config.txt PATH_CODE=D:\code\ PATH_BIN=D:\tools\ 读取配置批处理 @echo off for /f "tokens=1,2 delims==" %%i in (config.txt) do ( set %%i=%%j ) echo %PATH_CODE%\res echo %PATH_...
  • 方式一:采用ServletContext读取,读取配置文件的realpath,然后通过文件流读取出来。 因为是用ServletContext读取文件路径,所以配置文件可以放入在web-info的classes目录中,也可以在应用层级及web-info的目录中。...
  • golang读取配置文件

    万次阅读 2017-11-11 12:07:34
    在项目中往往将一些配置信息放到配置文件中,这样在不同的运行环境中,只需修改配置文件即可。 以下介绍两种通过第三方包获取配置文件的方式   一.通过gopkg.in/ini.v1 go get gopkg.in/ini.v1 1. 配置文件test....
  • Spring Boot 读取配置文件

    千次阅读 2020-02-27 16:24:50
    二、使用@value读取配置文件 第一步:创建DemoController @RestController @RequestMapping("/demo") public class DemoController { @Value("${server.port}") private String port; @GetMapping("/getPo.....
  • Golang库 - viper读取配置文件

    千次阅读 2020-06-18 18:07:31
    / 前言 / viper是由Steve Francia编写的开源配置解决方案, 也是cobra的作者, 我们来看下viper的功能 支持JSON、TOML、YAML/...在读取配置文件中我们将会演示viper的集中使用方式 我们以.yml文件为例 config.yml user:
  • js读取配置文件

    千次阅读 2018-01-22 09:32:11
    js读取配置文件 上传不了,总是说资源已经存在所以就只贴出路径了:https://www.ibm.com/developerworks/cn/web/1305_hezj_jqueryi18n/ 这是官方的,不用积分哦!!!!楼主已经用过了,很给力!!!!
  • Springboot使用-静态类读取配置文件

    千次阅读 2020-05-24 20:28:14
    文章目录1 springboot读取配置文件的两种方式2 静态类读取配置文件 1 springboot读取配置文件的两种方式 属性上使用:@Value("${xxxx}") 类上使用:@ConfigurationProperties(prefix = "xxx") 2 静态类读取配置文件...
  • IDEA读取配置文件

    千次阅读 2020-09-11 21:08:49
    1、在IDEA中,当使用以下代码读取配置文件时,无论配置文件放在哪个位置代码都找不到文件,最后发现,只要在当前的module下创建一个资源文件夹,将配置文件放入,即可解决以上问题。 // 1.读取配置文件中的4个基本...
  • ConfigServer从本地读取配置文件 Config Server可以从本地仓库读取配置文件,也可以从远处Git仓库读取。本地仓库是指将所有的配置文件统一写 在Config Server工程目录下Config Sever暴露Http API接口, ConfigClient...
  • Python读取配置文件中文乱码问题

    千次阅读 2019-07-17 10:29:39
    读取配置dbconfig.ini(含有中文)显示乱码的解决方法 一、原因 Python 3 中虽有encoding 参数,但是对于有BOM(如Windows下用记事本指定为utf-8)的文件,需要使用 utf-8-sig, 使用utf-8没办法。 二、解决方案 ...
  • 所以在网上找了一些引入INI配置文件的包,打算放一个到线上,一个线下,GO在运行时自己根据撸进去的配置文件参数连接不同数据库。在网上找了一些发现大量的BUG,非常不好用,所以今天利用大半天自己写了一个简单的包...
  • 很多人都知道读取配置文件,这是初级做法,上升一点难度是使用java bean的方式读取自定义配置文件,但是大家很少有知道读取pom文件信息,接下来我都会讲到。 正文 笔者还是基于Spring Boot :: (v1.5.8.RELEASE),...
  • Nacos Config使用,从nacos读取配置文件讲解 使用Nacos Config的好处:配置的生效是实时的,不需要重启或刷新 1、添加依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2、复制已经配置好的yml...
  • jsp 读取配置文件

    千次阅读 2018-06-27 17:05:26
    &lt;%@ page import="java.util.ResourceBundle" %&gt;ResourceBundle res = ResourceBundle.getBundle("application");String accessKey=res.getString("AccessKey"...
  • maven打包动态读取配置文件

    千次阅读 2018-08-26 17:59:40
    2、.properties文件配置: src/main/resources/db.properties文件配置: jdbc.driverClassName={jdbc.driverClassName} jdbc.url=${jdbc.url} jdbc.username=${jdbc.username} jdbc.p...
  • Springboot注解@Value读取配置文件参数

    千次阅读 2019-07-15 22:21:31
    1、读取application.ym文件配置直接在类属性上@Value("${application.yml里的字段}"); 2、读取自定义Properties文件配置: 在类上使用@PropertySource(可同时读取多个properties文件); 例子: 自定义两个...
  • NetCore 读取配置文件

    千次阅读 2019-02-14 19:27:40
    在项目目录下有个 appsettings.json ,我们先来操作这个文件。 在appsettings.json 添加如下两个节点。 { "Data": "LineZero", "ConnectionStrings": { "...
  • .NetCore 读取配置文件(随手笔记)

    千次阅读 2020-07-23 08:38:37
    添加配置字段 "ConnectionString": { "sqlServerConnStr": "sqlxxx", "mySqlConnStr": "mySqlxxx" } 三 读取配置文件数据: 1.以Home/Index 做测试 //相关页面 //相关方法 2.在页面引用 using Microsoft.Extensions....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,164,811
精华内容 465,924
关键字:

读取配置文件

友情链接: khat.rar