通過JAVA代碼對yaml文件進行增加、修改的操作


近期有個需求,需要通過java代碼對yaml文件進行修改或新增,對pom.xml文件進行添加依賴或者刪除依賴。

首先介紹對yaml文件的操作:

1.需要引入jar包:

 

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

2.在class文件中,需要添加一下屬性:

 

private static DumperOptions dumperOptions = new DumperOptions();
static{
    //設置yaml讀取方式為塊讀取
    dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
    dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
    dumperOptions.setPrettyFlow(false);
}

具體作用是為了生成出的yaml格式(詳細作用可百度),注意:該方法相當於重新生成yaml文件,原yaml文件中的注釋會消失,暫未找到解決方法。

update方法:

 

public boolean updateYaml(String url, String paramKey, Object paramValue) {
Yaml yaml = new Yaml(dumperOptions);
//yaml文件路徑
String yamlUr = url + yamlUrl;
Map map = null;
try {
    //將yaml文件加載為map格式
    map = yaml.loadAs(new FileInputStream(yamlUr), Map.class);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
//獲取當前參數值並且修改
boolean flag = updateYaml(paramKey, paramValue, map, yamlUr, yaml);
return flag;
}

 

/**
 * 修改yaml中屬性的值
 *
 * @param key      key是properties的方式: aaa.bbb.ccc (key不存在不修改)
 * @param value    新的屬性值 (新屬性值和舊屬性值一樣,不修改)
 * @param yamlToMap map結構
 * @param path 路徑
 * @return true 修改成功,false 修改失敗。
 */
public boolean updateYaml(String key, Object value, Map<String, Object> yamlToMap, String path, Yaml yaml) {
    Object oldVal = getValue(key, yamlToMap);
    //未找到key 不修改
    if (null == oldVal) {
        return false;
    }

    try {
        Map<String, Object> resultMap = setValue(yamlToMap, key, value);
        if (resultMap != null) {
            yaml.dump(resultMap, new FileWriter(path));
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        System.out.println("yaml file update failed !");
    }
    return false;
}

 

/**
 * key格式:aaa.bbb.ccc
 * 通過properties的方式獲取yaml中的屬性值
 *
 * @param key
 * @param yamlMap
 * @return
 */
public Object getValue(String key, Map<String, Object> yamlMap) {
    String[] keys = key.split("[.]");
    Object o = yamlMap.get(keys[0]);
    if (key.contains(".")) {
        if (o instanceof Map) {
            return getValue(key.substring(key.indexOf(".") + 1), (Map<String, Object>) o);
        } else {
            return null;
        }
    } else {
        return o;
    }
}

 

/**
 * 修改yaml中的屬性值
 */
public Map<String, Object> setValue(Map<String, Object> map, String key, Object value) {
    String[] keys = key.split("\\.");

    int len = keys.length;
    Map temp = map;
    for (int i = 0; i < len - 1; i++) {
        if (temp.containsKey(keys[i])) {
            temp = (Map) temp.get(keys[i]);
        } else {
            return null;
        }
        if (i == len - 2) {
            temp.put(keys[i + 1], value);
        }
    }
    for (int j = 0; j < len - 1; j++) {
        if (j == len - 1) {
            map.put(keys[j], temp);
        }
    }
    return map;
}

對yaml文件進行新增方法:

 

public boolean insertYaml(String key, Object value, Map<String, Object> yamlToMap, String path) {

    Yaml yaml = new Yaml(dumperOptions);
    String[] keys = key.split("\\.");

    int len = keys.length;
    Map temp = yamlToMap;

    for (int i = 0; i < len; i++) {
        if (temp.containsKey(keys[i])) {
            temp = (Map) temp.get(keys[i]);
        } else {
            //該處對yaml的層級需要有判斷,可能有問題
            if(i + 2 == len){
                Map<String, Object> newMap = new HashMap<>();
                newMap.put(keys[len-1],value);
                temp.put(keys[i],newMap);
                break;
            }else {
                temp.put(keys[i], value);
                break;
            }
        }
    }
    try {
        yaml.dump(yamlToMap, new FileWriter(path));
    } catch (Exception e) {
        System.out.println("yaml file insert failed !");
        return false;
    }
    return true;
}

對yaml文件中的字段進行刪除同樣可以做到,具體功能沒有實現。

近期有個需求,需要通過java代碼對yaml文件進行修改或新增,對pom.xml文件進行添加依賴或者刪除依賴。

首先介紹對yaml文件的操作:

1.需要引入jar包:

  1.  
    <dependency>
  2.  
    <groupId>org.yaml </groupId>
  3.  
    <artifactId>snakeyaml </artifactId>
  4.  
    </dependency>

2.在class文件中,需要添加一下屬性:

  1.  
    private static DumperOptions dumperOptions = new DumperOptions();
  2.  
    static{
  3.  
    //設置yaml讀取方式為塊讀取
  4.  
    dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
  5.  
    dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
  6.  
    dumperOptions.setPrettyFlow(false);
  7.  
    }

具體作用是為了生成出的yaml格式(詳細作用可百度),注意:該方法相當於重新生成yaml文件,原yaml文件中的注釋會消失,暫未找到解決方法。

update方法:

  1.  
    public boolean updateYaml(String url, String paramKey, Object paramValue) {
  2.  
    Yaml yaml = new Yaml(dumperOptions);
  3.  
    //yaml文件路徑
  4.  
    String yamlUr = url + yamlUrl;
  5.  
    Map map = null;
  6.  
    try {
  7.  
    //將yaml文件加載為map格式
  8.  
    map = yaml.loadAs(new FileInputStream(yamlUr), Map.class);
  9.  
    } catch (FileNotFoundException e) {
  10.  
    e.printStackTrace();
  11.  
    }
  12.  
    //獲取當前參數值並且修改
  13.  
    boolean flag = updateYaml(paramKey, paramValue, map, yamlUr, yaml);
  14.  
    return flag;
  15.  
    }
  1.  
    /**
  2.  
    * 修改yaml中屬性的值
  3.  
    *
  4.  
    * @param key key是properties的方式: aaa.bbb.ccc (key不存在不修改)
  5.  
    * @param value 新的屬性值 (新屬性值和舊屬性值一樣,不修改)
  6.  
    * @param yamlToMap map結構
  7.  
    * @param path 路徑
  8.  
    * @return true 修改成功,false 修改失敗。
  9.  
    */
  10.  
    public boolean updateYaml(String key, Object value, Map <String, Object> yamlToMap, String path, Yaml yaml) {
  11.  
    Object oldVal = getValue(key, yamlToMap);
  12.  
    //未找到key 不修改
  13.  
    if (null == oldVal) {
  14.  
    return false;
  15.  
    }
  16.  
     
  17.  
    try {
  18.  
    Map <String, Object> resultMap = setValue(yamlToMap, key, value);
  19.  
    if (resultMap != null) {
  20.  
    yaml.dump(resultMap, new FileWriter(path));
  21.  
    return true;
  22.  
    } else {
  23.  
    return false;
  24.  
    }
  25.  
    } catch (Exception e) {
  26.  
    System.out.println("yaml file update failed !");
  27.  
    }
  28.  
    return false;
  29.  
    }
  1.  
    /**
  2.  
    * key格式:aaa.bbb.ccc
  3.  
    * 通過properties的方式獲取yaml中的屬性值
  4.  
    *
  5.  
    * @param key
  6.  
    * @param yamlMap
  7.  
    * @return
  8.  
    */
  9.  
    public Object getValue(String key, Map <String, Object> yamlMap) {
  10.  
    String[] keys = key.split("[.]");
  11.  
    Object o = yamlMap.get(keys[0]);
  12.  
    if (key.contains(".")) {
  13.  
    if (o instanceof Map) {
  14.  
    return getValue(key.substring(key.indexOf(".") + 1), (Map <String, Object>) o);
  15.  
    } else {
  16.  
    return null;
  17.  
    }
  18.  
    } else {
  19.  
    return o;
  20.  
    }
  21.  
    }
  1.  
    /**
  2.  
    * 修改yaml中的屬性值
  3.  
    */
  4.  
    public Map <String, Object> setValue(Map <String, Object> map, String key, Object value) {
  5.  
    String[] keys = key.split("\\.");
  6.  
     
  7.  
    int len = keys.length;
  8.  
    Map temp = map;
  9.  
    for (int i = 0; i < len - 1; i++) {
  10.  
    if (temp.containsKey(keys[i])) {
  11.  
    temp = (Map) temp.get(keys[i]);
  12.  
    } else {
  13.  
    return null;
  14.  
    }
  15.  
    if (i == len - 2) {
  16.  
    temp.put(keys[i + 1], value);
  17.  
    }
  18.  
    }
  19.  
    for (int j = 0; j < len - 1; j++) {
  20.  
    if (j == len - 1) {
  21.  
    map.put(keys[j], temp);
  22.  
    }
  23.  
    }
  24.  
    return map;
  25.  
    }

對yaml文件進行新增方法:

  1.  
    public boolean insertYaml(String key, Object value, Map <String, Object> yamlToMap, String path) {
  2.  
     
  3.  
    Yaml yaml = new Yaml(dumperOptions);
  4.  
    String[] keys = key.split("\\.");
  5.  
     
  6.  
    int len = keys.length;
  7.  
    Map temp = yamlToMap;
  8.  
     
  9.  
    for (int i = 0; i < len; i++) {
  10.  
    if (temp.containsKey(keys[i])) {
  11.  
    temp = (Map) temp.get(keys[i]);
  12.  
    } else {
  13.  
    //該處對yaml的層級需要有判斷,可能有問題
  14.  
    if(i + 2 == len){
  15.  
    Map<String, Object> newMap = new HashMap <>();
  16.  
    newMap.put(keys[len-1],value);
  17.  
    temp.put(keys[i],newMap);
  18.  
    break;
  19.  
    }else {
  20.  
    temp.put(keys[i], value);
  21.  
    break;
  22.  
    }
  23.  
    }
  24.  
    }
  25.  
    try {
  26.  
    yaml.dump(yamlToMap, new FileWriter(path));
  27.  
    } catch (Exception e) {
  28.  
    System.out.println("yaml file insert failed !");
  29.  
    return false;
  30.  
    }
  31.  
    return true;
  32.  
    }

對yaml文件中的字段進行刪除同樣可以做到,具體功能沒有實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM