简化java编辑YML(YAML)格式配置文件操作

时间:2025-04-05 07:18:27

       最近做的项目里需要用java修改springboot的配置文件,需要新增或修改某一个属性的值,使用了snakeyaml发现在编辑多级结构的yaml文件时,操作较为复杂,所以做了些简化,不用每次都做特殊处理,使用类似于properties文件的处理方式。

       MAVEN上所需依赖。

<dependency>
    <groupId></groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.17</version>
</dependency>

      代码如下:


import ;
import ;

import .*;
import ;
import ;
import ;

/**
 * @author hongweidong
 * @desc 操作yaml文件的工具类
 * @date 2019-01-29 20:03
 */
public class YmlUtils {

    private final static DumperOptions OPTIONS = new DumperOptions();

    static {
        //将默认读取的方式设置为块状读取
        ();
    }

    /**
    * 初始化map,将map中属性包含.的形成多级map结构,方便保存
    * @param map 需要初始化的map
    * @author hongweidong
    */
    public static Map<String, Object> initMap(Map<String, Object> map){
        Map<String, Object> result = new LinkedHashMap<String, Object>();
        (map);
        for (String s : ()) {
            if((s) == null){
                (s,"");
            }
            if (s.split("\\.").length > 1) {
                String key[] = ("\\.");
                Map<String, Object> tarMap = new LinkedHashMap<String, Object>();
                for (int i = 0; i < ; i++) {
                    if (i == - 1) {
                        //最后一位
                        (key[i], (s));
                    } else {
                        if ((key[i]) != null) {
                            tarMap = (Map<String, Object>) (key[i]);
                        } else {
                            tarMap = (Map<String, Object>) (key[i]);
                        }
                    }
                }
                (s);
            }
        }
        return result;
    }

    /**
    * 测试方法
    */
    public static void main(String args[]){
        Map<String, Object> map = getYmlMap("F:/");
        //把spring下datasoource下primary下username的值改变root
        ("","root");
        map = initMap(map);
        try {
            addIntoYaml("F:/",map);
        } catch (IOException e) {
            ();
        }
        ("");
    }

    public static void addIntoYaml(String dest, Map<String, Object> map) throws IOException {
        map = (map);
        Yaml yaml = new Yaml(OPTIONS);
        //载入当前yml文件
        LinkedHashMap<String, Object> dataMap = (LinkedHashMap<String, Object>)(new FileReader(dest));
        //如果yml内容为空,则会引发空指针异常,此处进行判断
        if (null == dataMap) {
            dataMap = new LinkedHashMap<String, Object>();
        }
        (map);
        //将数据重新写回文件
        (dataMap, new FileWriter(dest));
    }

    public static LinkedHashMap<String, Object> getYmlMap(String path){
        File source = new File(path);
        Yaml yaml = new Yaml(OPTIONS);
        //载入文件
        LinkedHashMap<String, Object> dataMap = null;
        try {
            dataMap = (LinkedHashMap<String, Object>)(new FileReader(source));
        } catch (FileNotFoundException e) {
            ();
        }
        //获取当前key下的值(如果存在多个节点,则value可能为map,自行判断)
        return dataMap;
    }
}