今天就跟大家聊聊有关怎样读取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); }
@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; }
但是该方案有个弊端,数组应该如何注入呢?
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出来)。
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文件数据并匹配有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。