写这篇博客的原因是最近工作中遇到了一个问题,有一个需求是将过期的权限存到数据库中,但是到期时间这个字段又是新加的,然后权限过期表也是新建的表,所以分析了一波,决定第一次把直到昨天过期的权限存入到数据库中,然后写个定时任务,每天执行一次,将昨天到期的权限存入数据库。问题就来了,第一次将过期的权限存到数据库有两种方法,一个是写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文件的位置
有指正的地方欢迎讨论。