本文将介绍怎样使用 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