读取配置文件(properties、yaml)的八种方法

news2024/11/26 5:18:04

基础:

一、通过普通的I/O流读取配置文件(BufferedReader)

1、properties文件

在这里插入图片描述

2、测试类

public class TestReadProperties {
    @Test
    public void IOReadProperties() throws IOException {
        // 把配置文件的内容封装进map
        Map<String, Object> map = new HashMap<>();

        // 我这里使用 UTF-8 的编码格式输出properties文件
        // 但是我idea的properties编码为ISO-8859-1不支持中文显示,不过不重要,你想弄的话,自己去设置一下就好
        BufferedReader reader = new BufferedReader(
                new InputStreamReader( Files.newInputStream(Paths.get("src\\main\\resources\\application.properties")),
                        StandardCharsets.UTF_8));
        while (reader.ready()){
            String s = reader.readLine();
            String[] split = s.split("=");
            String prefix = split[0];
            String suffix = split[1];
            map.put(prefix,suffix);
        }
        // 用完关流
        reader.close();
        /* 
        使用 stream 流 输出map的key和value 
        由于Map是根据 哈希算法来排key的 顺序,所以这里输出的顺序 和properties不一样 
        但上述的 字符串 s 的输出顺序是一致的,可以去试一下
        * */
        map.forEach((key,value)->{
            System.out.print("key = " + key);
            System.out.println("  value = " + value);
        });
        
    }
}

3、结果(编码格式不一样,所以中文不显示,而idea默认properties为ISO的编码,而ISO编码是不支持中文的,所以就算我在字符读入流,规定编码为ISO,也是乱码)

在这里插入图片描述

二、通过Peoperties类读取文件(还是I/O读取)

先看一下这个类的源码,他是继承于HashTable,所以也是一个key-value形式存在的类

在这里插入图片描述

1、properties文件

在这里插入图片描述

2、测试类

public class TestReadProperties {
    @Test
    public void IOReadProperties2() throws IOException, InterruptedException {
        Properties properties = new Properties();
        properties.load(new InputStreamReader(
                Files.newInputStream(Paths.get("src\\main\\resources\\application.properties")),
                StandardCharsets.ISO_8859_1));
        // 利用Map中的Entry内部类进行遍历
        for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) {
            System.out.print("key = " + objectObjectEntry.getKey());
            System.out.println("  value = " + objectObjectEntry.getValue());
        }
        System.out.println("=============================================");
        System.out.println(properties.getProperty("url"));
        // 这里没有url2这个值,所以会返回"???"
        System.out.println(properties.getProperty("url2","???"));
        // 用完关闭流
        properties.clone();
    }
}

3、结果

在这里插入图片描述

使用Spring注解获取properties文件内容:

零、properties文件内容

test=abc
url="http://localhost:8080/test"
userName=WoRenBuDaoNi
passWord=123456
realName=我idea的properties编码为ISO-8859-1不支持中文显示,不过不重要,你想弄的话,自己去设置一下就好

animal.age=${random.int}
animal.name=cat${random.uuid}
animal.list[0]=a
animal.list[1]=b
animal.list[2]=c
animal.map[hello]=hello1
animal.map[world]=world1
animal.flag=true
animal.birth=2023/04/25

三、使用@Value注解

普通版:

1、测试类

@SpringBootTest
public class SpringReadProerties {
    @Value("${url}")
    private String url;
    
    /*
    * properties中是没有url2的配置,所以冒号后面是设置的默认值
    * 如果url2为空,则输出sadasdas
    * */
    @Value("${url2:sadasdas}")
    private String url2;

    @Test
    public void valueTest(){
        System.out.println(url);
        System.out.println(url2);
    }
}

2、结果

在这里插入图片描述

静态版:

下面给大家介绍 spring 不能注入 static 变量的原因,具体详情如下所示:

Spring 依赖注入 是依赖 set 方法

set 方法是 是普通的对象方法

static 变量是类的属性

1、创建一个StaticTest.java

@Component
public class StaticTest {
    public static String url;

    @Value("${url}")
    public void setUrl(String url) {
        StaticTest.url = url;
    }
}

2、测试类

@SpringBootTest
public class SpringReadProerties {
    private static String url;

    @Value("${url}")
    public void setUrl(String url) {
        SpringReadProerties.url = url;
    }


    @Test
    public void StaticTest(){
        // 静态类的url
        System.out.println(StaticTest.url);
        // 该类的静态url
        System.out.println(SpringReadProerties.url);
    }

}

3、结果:

在这里插入图片描述

四、使用@ConfigurationProperties注解

1、Animal类

@Component
@ConfigurationProperties(prefix = "animal")
public class Animal {
    private String name;
    private Integer age;
    private List<String> list;
    private Map<String,Object> map;
    private Boolean flag;
    private Date birth;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, Object> getMap() {
        return map;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

    public Boolean getFlag() {
        return flag;
    }

    public void setFlag(Boolean flag) {
        this.flag = flag;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }
}

2、测试类

@SpringBootTest
public class SpringReadProerties {
    @Autowired
    Animal animal2;

    @Test
    public void ConfigurationPropertiesTest(){
        // 因为我们取的对象需要Spring容器代理,
        // 所以我们new的对象是没有值得
        Animal animal = new Animal();
        System.out.println(animal.getName());
        // 这个被Spring代理的类才有用
        System.out.println(animal2.getName());
    }
}

3、结果

我们在这里打个断点看一下,果然只有Spring代理的对象才有值

在这里插入图片描述

五、使用Spring代理的Environment对象

1、测试类

@SpringBootTest
public class SpringReadProerties {
    @Autowired
    private Environment environment;

    @Test
    public void EnvironmentTest(){
        String url = environment
                .getProperty("url");
        System.out.println(url);
        String url2 = environment
                .getProperty("url2","???");
        System.out.println(url2);
    }
}

2、结果

在这里插入图片描述

六、使用Spring代理的ApplicationContext对象

1、测试类

@SpringBootTest
public class SpringReadProerties {
    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void ApplicationContextTest(){
        Environment environment = applicationContext.getEnvironment();
        String url = environment
                .getProperty("url");
        System.out.println(url);
        String url2 = environment
                .getProperty("url2","???");
        System.out.println(url2);
    }
}

2、结果

在这里插入图片描述

不使用注解,实现Spring接口获取properties文件内容:

零、properties文件内容

test=abc
url="http://localhost:8080/test"
userName=WoRenBuDaoNi
passWord=123456
realName=我idea的properties编码为ISO-8859-1不支持中文显示,不过不重要,你想弄的话,自己去设置一下就好

animal.age=${random.int}
animal.name=cat${random.uuid}
animal.list[0]=a
animal.list[1]=b
animal.list[2]=c
animal.map[hello]=hello1
animal.map[world]=world1
animal.flag=true
animal.birth=2023/04/25

七、实现EnvironmentAware接口

普通版:

1、测试类

@SpringBootTest
public class SpringReadProerties implements EnvironmentAware {

    private Environment environment;

    @Test
    public void EnvironmentTest(){
        String url = environment
                .getProperty("url");
        System.out.println(url);
        String url2 = environment
                .getProperty("url2","???");
        System.out.println(url2);
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
}

2、结果

在这里插入图片描述

静态版:

1、新建一个StaticTest.java

@Component
public class StaticTest implements EnvironmentAware {

    private static Environment environment;

    public static Environment getEnvironment(){
        return environment;
    }

    @Override
    public void setEnvironment(Environment environment) {
        StaticTest.environment = environment;
    }
}

2、测试类

@SpringBootTest
public class SpringReadProerties implements EnvironmentAware {

    private static Environment environment;

    @Test
    public void StaticTest(){
        // StaticTest的静态方法
        Environment environment = StaticTest.getEnvironment();
        String url = environment.getProperty("url");
        System.out.println(url);
        // 本地的静态属性
        System.out.println(SpringReadProerties
                .environment
                .getProperty("url"));
    }

    @Override
    public void setEnvironment(Environment environment) {
        SpringReadProerties.environment = environment;
    }
}

3、结果

在这里插入图片描述

八、实现ApplicationContextAware接口

普通版:

1、测试类

@SpringBootTest
public class SpringReadProerties implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Test
    public void ApplicationContextTest(){
        System.out.println(applicationContext
                .getEnvironment()
                .getProperty("url"));
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

2、结果

在这里插入图片描述

静态版:

1、静态类StaticTest.java

@Component
public class StaticTest implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        StaticTest.applicationContext = applicationContext;
    }
}

2、测试类

@SpringBootTest
public class SpringReadProerties implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Test
    public void StaticTest(){
        // 静态类的
        System.out.println(StaticTest
                .getApplicationContext()
                .getEnvironment()
                .getProperty("url"));
        // 本地的
        System.out.println(SpringReadProerties.applicationContext
                .getEnvironment()
                .getProperty("passWord"));
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringReadProerties.applicationContext = applicationContext;
    }
}

3、结果

在这里插入图片描述

yaml的配置和properties差不多,也可以用注解和Environment类进行获取,对应格式我给大家放在下面对比一下

properties文件:

test=abc
url="http://localhost:8080/test"
userName=WoRenBuDaoNi
passWord=123456
realName=我idea的properties编码为ISO-8859-1不支持中文显示,不过不重要,你想弄的话,自己去设置一下就好

animal.age=${random.int}
animal.name=cat${random.uuid}
animal.list[0]=a
animal.list[1]=b
animal.list[2]=c
animal.map[hello]=hello1
animal.map[world]=world1
animal.flag=true
animal.birth=2023/04/25

yaml文件:

test: abc
url: "http://localhost:8080/test"
userName: WoRenBuDaoNi
passWord: 123456
realName: 我idea的properties编码为ISO-8859-1不支持中文显示,不过不重要,你想弄的话,自己去设置一下就好
animal:
  age: ${random.int}
  name: cat${random.uuid}
  list:
    - a
    - b
    - c
  map: {hello: hello1,world: world1}
  flag: true
  birth: 2023/04/25
下就好

animal.age=${random.int}
animal.name=cat${random.uuid}
animal.list[0]=a
animal.list[1]=b
animal.list[2]=c
animal.map[hello]=hello1
animal.map[world]=world1
animal.flag=true
animal.birth=2023/04/25

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频可视化搭建项目,通过简单拖拽方式快速生产一个短视频

一、开源项目简介 《视搭》是一个视频可视化搭建项目。您可以通过简单的拖拽方式快速生产一个短视频&#xff0c;使用方式就像易企秀或百度 H5 等 h5 搭建工具一样的简单。目前行业内罕有关于视频可视化搭建的开源项目&#xff0c;《视搭》是一个相对比较完整的开源项目&#…

矿井下无人值守变电所电力监控系统的探讨与产品选型

摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功率、交换机或监控分站的传输口、高压配电装置的传输口…

(二)ElasticSearch 辅助工具 Kibana 介绍与安装

1、什么是 kibana &#xff1f; Kibana 是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff…

怎么使用chatgpt,GPT的使用方式解析

怎么使用Chatgpt&#xff1f;这是很多人心中的疑惑&#xff0c;更多的人只是听说过chatgpt的大名&#xff0c;但是具体连见都没见过gpt&#xff0c;那么接下来小编就来给大家详细的介绍一下吧。 一.了解chatgpt ChatGPT是一个由人工智能和自然语言处理技术构建的聊天机器人。通…

[pytorch]FixMatch代码详解-数据加载

原文 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence. 这里还有一个译制版的很方便阅读 FixMatch&#xff1a;通过一致性和置信度简化半监督学习 代码 pytorch的代码有很多版本&#xff0c;我选择了比较简单的一个&#xff1a; unoffi…

记一次某应用虚拟化系统远程代码执行

漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day)&#xff0c;攻击者可以通过该漏洞执行任意代码&#xff0c;导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台&#xff0c;它将用户…

xxl-job 7.32版本 安装部署

文章目录 前言xxl-job 7.32版本 安装部署1. xxl-job 是什么2. 特性3. xxl-job 部署安装3.1. 下载源码3.2. 部署:3.2.1. 初始化调度数据库3.2.2. 配置调度中心 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作…

GDOUCTF2023-部分re复现

目录 [GDOUCTF 2023]Check_Your_Luck [GDOUCTF 2023]Tea [GDOUCTF 2023]doublegame [GDOUCTF 2023]Check_Your_Luck 打开题目是一串代码&#xff0c;明显的z3约束器求解 直接上脚本 import z3 from z3 import Reals z3.Solver() vReal(v) xReal(x) yReal(y) wReal(w) zRea…

cocosLua 之文本相关

Text 用于创建系统或ttf文本&#xff0c; 类结构&#xff1a; #mermaid-svg-bMIqhf5X7M9uF2Ba {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bMIqhf5X7M9uF2Ba .error-icon{fill:#552222;}#mermaid-svg-bMIqhf5X7…

走进社区客户端测试 | 得物技术

0.引言 社区 C 端质量体系建设思考&#xff1f; 询问一下 ChatGPT 1、关于社区客户端 1.1 社区端上功能 得物首页 搜索、发布、关注流、推荐流、沉浸式单列流、活动 tab、其他二级频道 tab 动态详情页 图文、视频、专栏、点评 私域 个人/他人主页、通讯录好友、微博好友…

不得不用ChatGPT的100个理由……

❝ 最近无论在哪&#xff0c;很多人都在吹ChatGPT无所不能&#xff0c;动不动就是AI要颠覆人类&#xff0c;很多人害怕有一天AI会取代自己&#xff0c;我认为明显是多虑了…… ❝ 当然&#xff0c;也有很多小白试用了ChatGPT之后&#xff0c;并没有感觉到他很强大&#xff0c;主…

车载以太网解决方案

近年来&#xff0c;为了满足智能网联汽车的开发要求&#xff0c;车载以太网技术开始逐渐进入人们的视野。而以太网技术已经成为下一代车载络架构的趋势之一&#xff0c;其发展之迅猛&#xff0c;使得各主机厂纷纷产生了浓厚的兴趣并投入研发。 一 为什么使用车载以太网 | 对高…

什么牌子台灯好用不伤眼睛?盘点国内值得入手的护眼灯

选择一款不伤眼睛的台灯主要看光照柔和、光照范围广&#xff0c;符合标准照度国A或国AA、显色指数Ra90以上、无眩光、RG0无危害蓝光、无可视频闪等&#xff0c;对于现在许多青少年的近视率增加&#xff0c;一旦近视就无法恢复&#xff0c;保护好眼睛&#xff0c;在学习阅读时&a…

SpringBoot使用ElasticSearch

ES官网&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ES下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch kibana官网&#xff1a;https://www.elastic.co/cn/downloads/kibana kibana下载地址&#xff1a;https://…

小红书笔记发布软件 批量上传视频

百收网SEO短视频矩阵发布丨9平台视频发布助手 软件简述&#xff1a;软件仅支持win系统&#xff0c; 软件使用的是网页版模拟协议软件不绑定电脑&#xff0c;任意换机&#xff0c;不限登录账号数量&#xff0c; 软件支持抖音&#xff0c;快手&#xff0c;视频号&#xff0c;西瓜…

P1034 [NOIP2002 提高组] 矩形覆盖

题目描述 在平面上有 &#xfffd;n 个点&#xff0c;每个点用一对整数坐标表示。例如&#xff1a;当 &#xfffd;4n4 时&#xff0c;44 个点的坐标分另为&#xff1a;&#xfffd;1(1,1)p1​(1,1)&#xff0c;&#xfffd;2(2,2)p2​(2,2)&#xff0c;&#xfffd;3(3,6)p3​…

设备树总结

设备树的概念: 设备树&#xff08;Device Tree:DT&#xff09;是用来描述设备信息的一种树形结构。设备树文件在linux内核启动的时候传递到内核被内核解析。设备树中每一个设备节点中的信息构成了一个属性链表&#xff0c;如果驱动想要使用这个设备信息&#xff0c;只需要在这…

UE4架构初识(五)

UE4仿真引擎学习 一、架构基础 1. GameInstance UE提供的方案是一以贯之的&#xff0c;为我们提供了一个GameInstance类。为了受益于UObject的反射创建能力&#xff0c;直接继承于UObject&#xff0c;这样就可以依据一个Class直接动态创建出来具体的GameInstance子类。 UGam…

Pytest接口自动化测试实战演练

结合单元测试框架pytest数据驱动模型allure 目录 api&#xff1a; 存储测试接口conftest.py :设置前置操作目前前置操作&#xff1a;1、获取token并传入headers&#xff0c;2、获取命令行参数给到环境变量,指定运行环境commmon&#xff1a;存储封装的公共方法connect_mysql.p…

C. Magic Ship(二分 + 前缀和)

Problem - C - Codeforces 你是一艘船的船长。最初你站在一个点(x1&#xff0c;y1)上&#xff08;很明显&#xff0c;海上的所有位置都可以用笛卡尔平面描述&#xff09;&#xff0c;你想要前往一个点(x2&#xff0c;y2)。 你知道天气预报——长度为n的字符串s&#xff0c;仅由…