本文将介绍怎样使用 snakeyaml 库读取多个 yaml 文件内容,并且将读取到的数据转换成 Map 返回。
<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.28</version> </dependency>
application: port: 8080 name: demo1 config: maxThreadPool: 20
config: ip: 127.0.0.1 maxConnect: 100
import 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 Demo2 {
public static void main(String[] args) throws Exception {
InputStream[] inputStreams = new InputStream[]{
new ClassPathResource("demo2_1.yml").getInputStream(),
new ClassPathResource("demo2_2.yml").getInputStream()
};
Map<String, Object> resultMap = yamlHandler(inputStreams);
for(Map.Entry<String,Object> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
/**
* 单个yaml文件处理
* @param inputStreams
* @return
* @throws IOException
*/
public static Map<String, Object> yamlHandler(InputStream[] inputStreams) throws IOException {
//返回的结果
Map<String, Object> result = new LinkedHashMap<String, Object>();
Yaml yaml = new Yaml();
//多个文件处理
Iterator<InputStream> iterator = Arrays.asList(inputStreams).iterator();
while (iterator.hasNext()) {
UnicodeReader reader = new UnicodeReader(iterator.next());
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.maxThreadPool=20 config.ip=127.0.0.1 config.maxConnect=100