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

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

       MAVEN上所需依赖。


    org.yaml
    snakeyaml
    1.17

      代码如下:


import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

import java.io.*;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

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

    private final static DumperOptions OPTIONS = new DumperOptions();

    static {
        //将默认读取的方式设置为块状读取
        OPTIONS.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
    }

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

    /**
    * 测试方法
    */
    public static void main(String args[]){
        Map map = getYmlMap("F:/application.yml");
        //把spring下datasoource下primary下username的值改变root
        map.put("spring.datasource.primary.username","root");
        map = initMap(map);
        try {
            addIntoYaml("F:/application.yml",map);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.print("");
    }

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

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

 

 

 

 

你可能感兴趣的:(简化java编辑YML(YAML)格式配置文件操作)