温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-12-18 08:15:46 来源:亿速云 阅读:182 作者:柒染 栏目:开发技术

今天就跟大家聊聊有关怎样读取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<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() {     }     /**      * 读取yml的配置文件数据      * @param filePath      * @param keys      * @return      */     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;     }     /**      * 获取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<String, String> cId = getYmlByFileName("classpath:test.yml", "auth", "clients");         //cId.get("")         String json = cId.get("auth.clients");         List<Map> 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文件数据并匹配有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI