diff --git a/framework/commons/src/main/java/cd/casic/framework/commons/util/yaml/YamlUtils.java b/framework/commons/src/main/java/cd/casic/framework/commons/util/yaml/YamlUtils.java new file mode 100644 index 0000000..5a945a6 --- /dev/null +++ b/framework/commons/src/main/java/cd/casic/framework/commons/util/yaml/YamlUtils.java @@ -0,0 +1,159 @@ +package cd.casic.framework.commons.util.yaml; + +import lombok.Data; +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; +import java.util.Set; + +/** + *

TODO

+ * + * @author mian-bin + * @Description YamlUtils + * @date 2025/1/10 15:22 + */ +public class YamlUtils { + private final static DumperOptions OPTIONS = new DumperOptions(); + + private static File file; + + private static InputStream ymlInputSteam; + + private static Object CONFIG_MAP; + + private static Yaml yaml; + + static { + OPTIONS.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + } + + /** + * 使用其他方法之前必须调用一次 设置yml的输出文件,当没有设置输入流时可以不设置输入流,默认以此文件读入 + * + * @param file 输出的文件 + */ + public static void setYmlFile(File file) throws FileNotFoundException { + YamlUtils.file = file; + if (ymlInputSteam == null) { + setYmlInputSteam(new FileInputStream(file)); + } + } + + + /** + * 使用其他方法之前必须调用一次 设置yml的输入流 + * + * @param inputSteam 输入流 + */ + public static void setYmlInputSteam(InputStream inputSteam) { + ymlInputSteam = inputSteam; + yaml = new Yaml(OPTIONS); + CONFIG_MAP = yaml.load(ymlInputSteam); + } + + public static void close() { + try { + ymlInputSteam.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 根据键获取值 + * + * @param key 键 + * @return 查询到的值 + */ + @SuppressWarnings("unchecked") + public static Object getByKey(String key) { + if (ymlInputSteam == null) { + return null; + } + String[] keys = key.split("\\."); + Object configMap = CONFIG_MAP; + for (String s : keys) { + if (configMap instanceof Map) { + configMap = ((Map) configMap).get(s); + } else { + break; + } + } + return configMap == null ? "" : configMap; + } + + /** + * 保存或更新 + * + * @param key key + * @param value value + * @throws IOException + */ + public static void saveOrUpdateByKey(String key, Object value) throws IOException { + KeyAndMap keyAndMap = new KeyAndMap(key).invoke(); + key = keyAndMap.getKey(); + Map map = keyAndMap.getMap(); + map.put(key, value); + yaml.dump(CONFIG_MAP, new FileWriter(file)); + } + + /** + * 移除key + * + * @param key key + * @throws Exception + */ + public static void removeByKey(String key) throws Exception { + KeyAndMap keyAndMap = new KeyAndMap(key).invoke(); + key = keyAndMap.getKey(); + Map map = keyAndMap.getMap(); + Map fatherMap = keyAndMap.getFatherMap(); + map.remove(key); + if (map.size() == 0) { + Set> entries = fatherMap.entrySet(); + for (Map.Entry entry : entries) { + if (entry.getValue() == map) { + fatherMap.remove(entry.getKey()); + } + } + } + yaml.dump(CONFIG_MAP, new FileWriter(file)); + } + + @Data + private static class KeyAndMap { + private String key; + private Map map; + private Map fatherMap; + + public KeyAndMap(String key) { + this.key = key; + } + + public KeyAndMap invoke() { + if (file == null) { + System.err.println("请设置文件路径"); + } + if (null == CONFIG_MAP) { + CONFIG_MAP = new LinkedHashMap<>(); + } + String[] keys = key.split("\\."); + key = keys[keys.length - 1]; + map = (Map) CONFIG_MAP; + for (int i = 0; i < keys.length - 1; i++) { + String s = keys[i]; + if (map.get(s) == null || !(map.get(s) instanceof Map)) { + map.put(s, new HashMap<>(4)); + } + fatherMap = map; + map = (Map) map.get(s); + } + return this; + } + } +}