处理多个 yaml 文件

本文将介绍怎样使用 snakeyaml 库读取多个 yaml 文件内容,并且将读取到的数据转换成 Map 返回。

本文将介绍怎样使用 snakeyaml 库读取多个 yaml 文件内容,并且将读取到的数据转换成 Map 返回。

添加 Maven 依赖

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.28</version>
</dependency>

添加 demo2_1.yml 和 demo2_2.yml 文件

demo2_1.yml

application:
  port: 8080
  name: demo1
config:
  maxThreadPool: 20

demo2_2.yml

config:
  ip: 127.0.0.1
  maxConnect: 100

Java 代码

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
一个不注意小事情的人,永远不会成功大事业。——戴尔·卡耐基
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号