写这篇博客的原因是最近工作中遇到了一个问题,有一个需求是将过期的权限存到数据库中,但是到期时间这个字段又是新加的,然后权限过期表也是新建的表,所以分析了一波,决定第一次把直到昨天过期的权限存入到数据库中,然后写个定时任务,每天执行一次,将昨天到期的权限存入数据库。问题就来了,第一次将过期的权限存到数据库有两种方法,一个是写sql脚本,直接在数据库存;第二个是让这个存储方法只执行一次,所以就出现了今天的这篇博客,之前我想的方法是定义一个全局变量,然后执行完这个方法之后,就改变变量,下次就不让它执行了;
但是这个方法很明显不行,因为要是重启项目,这个变量就毫无意义了。然后就想着在yml文件中定义一个变量,然后读取这个变量,执行完添加方法之后就改变变量(因为公司用的是SpringBoot,所以就没有关于xml这里就不提了)
接下来上代码:
这是修改yaml文件的方法,我是在测试类中实验的,亲测有效哦
@Test
public void updateYaml(){
try {
URL url = Test.class.getClassLoader().getResource("application.yml");
DumperOptions dumperOptions = new DumperOptions();
dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
dumperOptions.setPrettyFlow(false);
Yaml yaml = new Yaml(dumperOptions);
Map map =(Map)yaml.load(new FileInputStream(url.getFile()));
System.out.println("这是修改前:"+map.get("isOne"));
map.put("isOne",false);
yaml.dump(map, new OutputStreamWriter(new FileOutputStream(url.getFile())));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
这个地方注意一下,我用的Map方式来接的值,你也可以用Json也可以或者Object
然后在修改之前的时候要先读取
Map map =(Map)yaml.load(new FileInputStream(url.getFile()));
就是这一句,读取yaml文件的内容,这个map中的isOne是我在yaml文件中定义的变量
isOne :true
就是这样直接定义的
然后修改的主要方法是
yaml.dump(map, new OutputStreamWriter(new FileOutputStream(url.getFile())));
yaml的dump方法,但是有一个问题,你要先定义yaml中的格式
用
DumperOptions dumperOptions = new DumperOptions();
dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
dumperOptions.setPrettyFlow(false);
Yaml yaml = new Yaml(dumperOptions);
要是你直接Yaml yaml= new Yaml();
这样的话就不能调用dump方法了
然后读取yaml中的内容
@Test
public void getIsOne(){
try {
Yaml yaml = new Yaml();
URL url = Test.class.getClassLoader().getResource("application.yml");
if (url != null) {
//获取test.yaml文件中的配置数据,然后转换为obj,
Object obj =yaml.load(new FileInputStream(url.getFile()));
System.out.println(obj);
//也可以将值转换为Map
Map map =(Map)yaml.load(new FileInputStream(url.getFile()));
System.out.println(map.get("isOne"));
//通过map我们取值就可以了.
}
} catch (Exception e) {
e.printStackTrace();
}
}
其中主要的就是yaml的load方法,url方法是找到你的yml文件的位置
有指正的地方欢迎讨论。