文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎样读取properties或yml文件数据并匹配

2023-06-22 02:45

关注

今天就跟大家聊聊有关怎样读取properties或yml文件数据并匹配,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

读取properties或yml文件数据并匹配

使用springboot获取配置的文件的数据有多种方式,其中是通过注解@Value,此处通过IO获取配置文件内容。

此前已经在另外的test.xml文件中的bean中可设置xx或yy,这里实现如果test.xml文件中没有设置,可在application.*文件中进行设置。

如下:

try {                InputStream stream = getClass().getClassLoader().getResourceAsStream("application.properties");                if(stream == null){                    stream = getClass().getClassLoader().getResourceAsStream("application.yml");                    InputStreamReader in = new InputStreamReader(stream, "gbk");                    BufferedReader reader = new BufferedReader(in);                    String line;                    while ((line = reader.readLine()) != null) {                        if(line.trim().split(":")[0].contentEquals("xx")){                        //在test.xml中读取后可通过set传值。这里也可以自己通过设置相应参数的set方法进行传值                            this.setXX(line.trim().split(":")[1].trim());                         }else if(line.trim().split(":")[0].contentEquals("yy")){                            this.setYY(line.trim().split(":")[1].trim());                        }                    }                }else{                    InputStreamReader in = new InputStreamReader(stream, "gbk");                    BufferedReader reader = new BufferedReader(in);                    String line;                    while ((line = reader.readLine()) != null) {                        if(line.trim().split("=")[0].contentEquals("xx")){                        //在test.xml中读取后可通过set传值。这里也可以自己通过设置相应参数的set方法进行传值                            this.setXX(line.trim().split(":")[1].trim());                         }else if(line.trim().split("=")[0].contentEquals("yy")){                            this.setYY(line.trim().split(":")[1].trim());                        }                    }                }            } catch (FileNotFoundException e) {                logger.error("无法找到application.*文件",e);            } catch (IOException e) {                logger.error("读取配置文件的ip或port有问题",e);            }

读取yml,properties配置文件几种方式小结

1-@value

@Value("${keys}")private String key;

这里需要注意的是

因为Spring的@Value依赖注入是依赖set方法,而自动生成的set方法是普通的对象方法,你在普通的对象方法里,都是给实例变量赋值的,不是给静态变量赋值的,static修饰的变量,一般不生成set方法。若必须给static修饰的属性赋值可以参考以下方法

private static String url;   // 记得去掉static @Value("${mysql.url}") public void setDriver(String url) {          JdbcUtils.url= url; }

但是该方案有个弊端,数组应该如何注入呢?

2-使用对象注入

auth:   clients:     - id:1      password: 123    - id: 2      password: 123
@Component@ConfigurationProperties(prefix="auth")public class IgnoreImageIdConfig { private List<Map<String,String>> clients =new ArrayList<Integer>(); }

利用配置Javabean的形式来获得值,值得注意的是,对象里面的引用名字(‘clients'),必须和yml文件中的(‘clients')一致,不然就会取不到数据,另外一点是,数组这个对象必须先new出来,如果没有对象的话也会取值失败的,(同理map形式也必须先将map对应的对象new出来)。

3-读取配置文件

 private static final String FILE_PATH = "classpath:main_data_sync.yml";    static Map<String, String> result = null;    private static Properties properties = null;    private YmlUtil() {    }        public static Map<String, String> getYmlByFileName(String filePath, String... keys) {        result = new HashMap<>(16);        if (filePath == null) {            filePath = FILE_PATH;        }        InputStream in = null;        File file = null;        try {            file = ResourceUtils.getFile(filePath);            in = new BufferedInputStream(new FileInputStream(file));            Yaml props = new Yaml();            Object obj = props.loadAs(in, Map.class);            Map<String, Object> param = (Map<String, Object>) obj;            for (Map.Entry<String, Object> entry : param.entrySet()) {                String key = entry.getKey();                Object val = entry.getValue();                if (keys.length != 0 && !keys[0].equals(key)) {                    continue;                }                if (val instanceof Map) {                    forEachYaml(key, (Map<String, Object>) val, 1, keys);                } else {                    String value = val == null ? null : JSONObject.toJSONString(val);                    result.put(key, value);                }            }        } catch (FileNotFoundException e) {            e.printStackTrace();        }        return result;    }    public static Map<String, String> forEachYaml(String keyStr, Map<String, Object> obj, int i, String... keys) {        for (Map.Entry<String, Object> entry : obj.entrySet()) {            String key = entry.getKey();            Object val = entry.getValue();            if (keys.length > i && !keys[i].equals(key)) {                continue;            }            String strNew = "";            if (StringUtils.isNotEmpty(keyStr)) {                strNew = keyStr + "." + key;            } else {                strNew = key;            }            if (val instanceof Map) {                forEachYaml(strNew, (Map<String, Object>) val, ++i, keys);                i--;            } else {                String value = val == null ? null : JSONObject.toJSONString(val);                result.put(strNew, value);            }        }        return result;    }        public static String getProperties(String filePath,String key) throws IOException {        if (properties == null) {            Properties prop = new Properties();            //InputStream in = Util.class.getClassLoader().getResourceAsStream("testUrl.properties");            InputStream in = new BufferedInputStream(new FileInputStream(ResourceUtils.getFile(filePath)))  ;            prop.load(in);            properties = prop;        }        return properties.getProperty(key);    }    public static void main(String[] args) {                try {            String properties = getProperties("classpath:test.properties", "fileServerOperator.beanName");            System.out.println(properties);        } catch (IOException e) {            e.printStackTrace();        }    }
auth:  #认证  clients:    - id: 1      secretKey: ba2631ee44149bbe #密钥key    - id: 2      secretKey: ba2631ee44149bbe #密钥key

看完上述内容,你们对怎样读取properties或yml文件数据并匹配有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯