增加了一个yaml,后面读取文件要用到
This commit is contained in:
parent
fc63643b3f
commit
f557f371ac
@ -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;
|
||||
|
||||
/**
|
||||
* <p>TODO</p>
|
||||
*
|
||||
* @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<String, Object>) 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<String, Object> 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<String, Object> map = keyAndMap.getMap();
|
||||
Map<String, Object> fatherMap = keyAndMap.getFatherMap();
|
||||
map.remove(key);
|
||||
if (map.size() == 0) {
|
||||
Set<Map.Entry<String, Object>> entries = fatherMap.entrySet();
|
||||
for (Map.Entry<String, Object> 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<String, Object> map;
|
||||
private Map<String, Object> 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<String, Object>) 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<String, Object>) map.get(s);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user