当前位置:网站首页>SnakeYAML配置文件解析器
SnakeYAML配置文件解析器
2022-06-25 17:01:00 【四問四不知】
序言
實際開發項目中會有好多的配置文件,有yml後綴的配置文件,也有properties後綴的配置文件,xml、ini、conf、yaml等等。使用時大多都會經過加載解析的過程。
那麼如果自己想要加載一個yaml文件的數據怎麼做呢?
springboot框架中我們可以通過@Value("${}")注解加載配置文件中的對象、數組或純量(scalars)。
下面看看如何使用SnakeYAML解析配置文件,
實戰
創建一個test.yaml文件在resources目錄下,
field1: "String"
field2: 2
properties:
name: "my Test"
age: 13
創建自己的實例對象類MyInstance
package com.hust.zhang.yaml;
import lombok.Data;
import java.util.Map;
@Data
public class MyInstance {
public String field1;
public Integer field2;
public Map<String, Object> properties;
}測試類
package com.hust.zhang.yaml;
import com.google.common.io.CharStreams;
import org.yaml.snakeyaml.Yaml;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class YamlTest {
//通過創建Yaml對象生成ThreadLocal初始化變量
private final static ThreadLocal<Yaml> YAML_THREAD_LOCAL = ThreadLocal.withInitial(Yaml::new);
public static void main(String[] args) {
String name = "/test.yaml";
MyInstance instance = load(name);
System.out.println(instance.getName());
}
/**
* 加載Yaml文件對象並轉換成實例對象
*
* @param name
* @return
*/
private static MyInstance load(String name) {
Yaml yaml = YamlTest.YAML_THREAD_LOCAL.get();
try (final InputStream inputStream = Yaml.class.getResourceAsStream(name)) {
final String conf = CharStreams.toString(new InputStreamReader(inputStream));
return yaml.loadAs(conf, MyInstance.class);
} catch (IOException e) {
System.out.println("read yaml error : " + e);
} catch (Exception e) {
System.out.println("other error :" + e);
}
return null;
}
}輸出結果如下,

上面需注意的點:
1、ThreadLocal是一個綁定線程的變量,它讓每個線程獨享自己的副本,避免了資源競爭。這樣每個線程調用都能够拿到自己的Yaml對象。你說直接在主線程裏創建Yaml對象不可以嗎?當然可以,只不過這麼寫是為了複習ThreadLocal知識點。
2、try-catch語句塊中用到了try-with-resource語法,這個前面講過可以不需要我們手動去釋放IO資源,簡化了代碼。
3、通過class.getResourceAsStream(String name)方法獲取輸入流,查詢資源規則由給定的類的類加載器實現,對name以"/"開頭讀取絕對路徑的資源。而它和class.getClassLoader().getResourceAsStream(String name)方法區別在於,後者是獲取當前類的類加載器,默認從resources文件中獲取不帶"/"開頭的資源。通過new InputStream(new File(name))獲取輸入流資源也是可以的。
4、yaml.loadAs()方法可以從輸入流中獲取數據轉換成對象,也可以從String字符串中獲取數據轉換成對象。
參考鏈接:
边栏推荐
- internship:Swagger下注解的涉及 接口的提供
- 【微服务|Sentinel】流控规则概述|针对来源|流控模式详解<直接 关联 链路>
- Uniapp to preview pictures (single / multiple)
- 2022-06-17 advanced network engineering (x) is-is-general header, establishment of adjacency relationship, IIH message, DIS and pseudo node
- FreeRTOS内核时钟不对的问题解决
- Effects and laws
- 二十九-使用RealSenseD435进行ORBSLAM2实时三维重建
- STM32硬件错误HardFault_Handler的处理方法
- Read mysql45 lecture - index
- 代码注释的艺术,优秀代码真的不需要注释吗?
猜你喜欢
随机推荐
internship:Swagger下注解的涉及 接口的提供
mysql使用过程中遇到的问题
3.条件概率与独立性
pytorch官方文档学习记录
Wireshark network card cannot be found or does not display the problem
Read mysql45 the next day
Uniapp to preview pictures (single / multiple)
Day_ twelve
How to talk about salary correctly in software testing interview
Differences between et al and etc
How did I get a salary increase of 13k+ after one year of employment?
SMART PLC如何构造ALT指令
3年,我是如何涨薪到20k?
Effects and laws
Day_ thirteen
剑指 Offer II 014. 字符串中的变位词 滑动窗口
Notes: lbcf: a Large Scale budget Constrained causal Forest Algorithm
剑指 Offer II 035. 最小时间差
使用hbuilder X创建uniapp项目
JVM memory structure







