如何读取properties或yml文件数据并匹配
作者:NoteDay
这篇文章主要介绍了如何读取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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。