1. 程式人生 > 實用技巧 >通過JAVA程式碼對yaml檔案進行增加、修改的操作

通過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. try {
  17. Map<String, Object> resultMap = setValue(yamlToMap, key, value);
  18. if (resultMap != null) {
  19. yaml.dump(resultMap, new FileWriter(path));
  20. return true;
  21. } else {
  22. return false;
  23. }
  24. } catch (Exception e) {
  25. System.out.println("yaml file update failed !");
  26. }
  27. return false;
  28. }
  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. int len = keys.length;
  7. Map temp = map;
  8. for (int i = 0; i < len - 1; i++) {
  9. if (temp.containsKey(keys[i])) {
  10. temp = (Map) temp.get(keys[i]);
  11. } else {
  12. return null;
  13. }
  14. if (i == len - 2) {
  15. temp.put(keys[i + 1], value);
  16. }
  17. }
  18. for (int j = 0; j < len - 1; j++) {
  19. if (j == len - 1) {
  20. map.put(keys[j], temp);
  21. }
  22. }
  23. return map;
  24. }

對yaml檔案進行新增方法:

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

對yaml檔案中的欄位進行刪除同樣可以做到,具體功能沒有實現。