千家信息网

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

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,今天就跟大家聊聊有关怎样读取properties或yml文件数据并匹配,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。读取properties或
千家信息网最后更新 2025年02月08日怎样读取properties或yml文件数据并匹配

今天就跟大家聊聊有关怎样读取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不会赋值给static修饰的变量。

因为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> clients =new ArrayList(); }

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

3-读取配置文件

 private static final String FILE_PATH = "classpath:main_data_sync.yml";    static Map result = null;    private static Properties properties = null;    private YmlUtil() {    }    /**     * 读取yml的配置文件数据     * @param filePath     * @param keys     * @return     */    public static Map 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 param = (Map) obj;            for (Map.Entry 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) 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 forEachYaml(String keyStr, Map obj, int i, String... keys) {        for (Map.Entry 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) val, ++i, keys);                i--;            } else {                String value = val == null ? null : JSONObject.toJSONString(val);                result.put(strNew, value);            }        }        return result;    }    /**     * 获取Properties类型属性值     * @param filePath classpath:文件名     * @param key key值     * @return     * @throws IOException     */    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) {        /*Map cId = getYmlByFileName("classpath:test.yml", "auth", "clients");        //cId.get("")        String json = cId.get("auth.clients");        List maps = JSONObject.parseArray(json, Map.class);        System.out.println(maps);*/        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文件数据并匹配有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0