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

网友投稿 284 2022-09-08


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

目录读取properties或yml文件数据并匹配读取yml,properties配置文件几种方式小结1-@value2-使用对象注入3-读取配置文件

读取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 = "cPPPNULlasspath: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)) PPPNUL{

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开发者团队协作的8个小技巧,教你优雅的完成开发者团队协作
下一篇:Linux内核中VLAN的实现过程(1)-主要数据结构(Linux vlan)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~