本文将介绍怎样使用 snakeyaml 库读取单个 yaml 文件内容,并且将读取到的数据转换成 Map 返回。
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.28</version>
</dependency>在 resources 目录下面创建 demo1.yml 配置文件,如下:
application:
port: 8080
name: demo1
config:
ip: 127.0.0.1
maxConnect: 100import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.reader.UnicodeReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
/**
* 单个yaml文件处理
* @author Administrator 2021/6/7 12:37
* @version 1.0
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
ClassPathResource resource = new ClassPathResource("demo1.yml");
Map<String, Object> resultMap = yamlHandler(resource.getInputStream());
for(Map.Entry<String,Object> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
/**
* 单个yaml文件处理
* @param inputStream
* @return
* @throws IOException
*/
public static Map<String, Object> yamlHandler(InputStream inputStream) throws IOException {
//返回的结果
Map<String, Object> result = new LinkedHashMap<String, Object>();
//读取方式
UnicodeReader reader = new UnicodeReader(inputStream);
//单文件处理
Yaml yaml = new Yaml();
Object object = yaml.load(reader);
//这里只是简单处理,需要多个方式可以自己添加
if (object instanceof Map) {
Map map = (Map) object;
buildFlattenedMap(result, map, null);
}
reader.close();
return result;
}
/**
* 这部分代码来至springboot源码部分对yaml的解析
* YamlProcessor.java buildFlattenedMap方法
* @param result
* @param source
* @param path
*/
private static void buildFlattenedMap(Map<String, Object> result,
Map<String, Object> source, String path) {
//循环读取原数据
for(Map.Entry<String,Object> entry : source.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
//如果存在路径进行拼接
if (StringUtils.hasText(path)) {
if (key.startsWith("[")) {
key = path + key;
} else {
key = path + '.' + key;
}
}
//数据类型匹配
if (value instanceof String) {
result.put(key, value);
} else if (value instanceof Map) {
//如果是map,就继续读取
Map<String, Object> map = (Map)value;
buildFlattenedMap(result, map, key);
} else if (value instanceof Collection) {
Collection<Object> collection = (Collection)value;
if (collection.isEmpty()) {
result.put(key, "");
} else {
int count = 0;
Iterator var7 = collection.iterator();
while(var7.hasNext()) {
Object object = var7.next();
buildFlattenedMap(result, Collections.singletonMap("[" + count++ + "]", object), key);
}
}
} else {
result.put(key, value != null ? value : "");
}
}
}
}运行上面代码,输出如下:
application.port=8080
application.name=demo1
config.ip=127.0.0.1
config.maxConnect=100