背景:
在开发过程中,经常会碰到需要用到读取配置文件内容从而达到目的,故在此列几种我自己用到过的读取方法,记录一下,也方便大家查阅方便。
情景:
在使用过程中看情况使用,如果是springboot项目的话,最好直接用方法二,没有springboot可以用方法1结合方法3,将方法一中的
String str = "E:/ssl/ssl.properties";
in = new FileInputStream(str);
替换为
in = EppTransportTcpTlsImpl.class.getClassLoader().getResourceAsStream("ssl.properties");
就不用担心项目移动导致路径变化,也能更方便的发布到服务器上而不用每次都要修改路径。
1.通常读取方法:
需求:通过传入一个字符串,判断调用配置文件里面的哪些配置,并返回对应的map。
/**
* 这个类提供将配置文件里面的属性根据传入的值提取到对应map里面的方法
* @author Wzy525110
*/
public class PropertiesToMap {
/**
* 这个方法能将配置文件里面的属性根据传入的值提取到对应map里面
* @param str1
* @return
*/
public Map<String,String> getProp(String str1) throws Exception{
Properties pro = new Properties();
//初始化
FileInputStream in = null;
//创建一个map,key存放配置文件属性的属性名,value存放配置文件属性的属性值
Map<String,String> testMap = new HashMap<String, String>();
try {
//文件的路径及文件名
// String str = "/usr/local/java/ssl.properties";
String str = "E:/ssl/ssl.properties";
in = new FileInputStream(str);
//读取文件
pro.load(in);
//把文件里面的key(属性名)拿出来
Iterator<String> it=pro.stringPropertyNames().iterator();
//根据key去遍历
while(it.hasNext()){
//如果还有,就给这个key一个值
String key=it.next();
//判断这个值是否包含传进来的字符串的值,包含为1,不包含为-1
if (key.indexOf(str1) != -1){
//找到这个key对应的属性
String value=pro.getProperty(key);
//把遍历的结果放入map里面
testMap.put(key,value);}
}
} catch (FileNotFoundException e) {
throw new FileNotFoundException("找不到文件FileNotFoundException,"+this.getClass().getName());
} catch (IOException e) {
throw new IOException("IOException,"+this.getClass().getName());
}finally {
if(in !=null){
try {
//最后关闭读取
in.close();
} catch (IOException e) {
throw new IOException("IOException,"+this.getClass().getName());
}
}
}
//返回这个map集合
return testMap;
}
}
2.Springboot中读取配置文件:
首先声明一点,springboot获取资源文件,需要看是
1》从spring boot默认的application.properties资源文件中获取
2》还是从自定义的资源文件中获取
带着这个想法去看下面几种方式
原文链接,作者写的相当详细,本文仅未引用代码部分
【spring Boot】spring boot获取资源文件的三种方式【两种情况下】
https://www.cnblogs.com/sxdcgaq8080/p/7659074.html
===============================================================================================
1》从spring boot默认的application.properties资源文件中获取
先给出来application.properties的内容
①===第一种方式:使用@ConfigurationProperties获取配置文件
先搞一个绑定资源文件的bean
注意属性名和资源文件中的属性名相一致。
然后在启动类中使用
结果如下:
控制台打印:
访问地址:
②===第二种方式:使用@Value获取配置文件
这里不用搞一个绑定资源文件的bean了。
只需要在你想用的地方使用@Value调用你想要的属性名对应的值即可。
访问结果:
③===第三种方式:使用Environment获取资源文件
也不用提前做什么使用,Environment就是一个全局的资源池,application.properties中的属性值都可以从这里获取到。
运行结果:
================================================================================================
2》从自定义的资源文件中获取属性值
①===第一种方式:使用@ConfigurationProperties获取配置文件
自定义资源文件如下:
然后指定绑定自定义资源文件
最后在启动类中使用一下
运行结果:
②===第二种方式:使用@Value获取配置文件
先设定一个自定义资源文件
如下,自定义资源文件需要满足application-{profile}.properties格式
然后在application.properties文件中指明加载这个资源文件
spring.profiles.active=test #spring.profiles.include=test
这两种哪种都可以加载上自定义的资源文件,后面的test就是上面{profile}的值
最后在启动类中使用@Value获取自定义资源文件中的属性,这个时候自定义的资源文件已经在application,properties文件中被指明要被加载了,因此是可以被获取到的
运行结果:
③===第三种方式:使用Environment获取资源文件
首先还是写一个自定义的资源文件,文件命名同上面第二种方式一样
接着,在application.properties中声明加载这个自定义的资源文件
最后在启动类中,也就是哪里使用就在那里自动注入Environment.
3.java配置文件的读取写入的解决方案(getResourceAsStream的用法)
原文链接,作者写的相当详细,本文仅未引用代码部分
java配置文件的读取写入的解决方案(getResourceAsStream的用法)
https://blog.csdn.net/cyxinda/article/details/78254057
===============================================================================================
1,首先,Java中的getResourceAsStream有以下几种:
1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
3. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。
4. Jsp下的application内置对象就是上面的ServletContext的一种实现。
其次,getResourceAsStream 用法大致有以下几种:
第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml
那么,应该有如下代码:
me.class.getResourceAsStream("myfile.xml");
第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml
那么,应该有如下代码:
me.class.getResourceAsStream("file/myfile.xml");
第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml
那么,应该有如下代码:
me.class.getResourceAsStream("/com/x/file/myfile.xml");
总结一下,可能只是两种写法
第一:前面有 “ / ”
“ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject
me.class.getResourceAsStream("/com/x/file/myfile.xml");
第二:前面没有 “ / ”
代表当前类的目录
me.class.getResourceAsStream("myfile.xml");
me.class.getResourceAsStream("file/myfile.xml");
最后,自己的理解:
getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
配置文件读取:
private static Properties properties = new Properties();
properties.load(getClass().getResourceAsStream(conifgName));
String value = properties.getString(key);
1,首先,Java中的getResourceAsStream有以下几种:
/**
* 修改某个属性
* @param key 修改的属性名
* @param value 修改的属性值
* @return
*/
public static String setString(String key, String value) {
OutputStream fos = null;
try {
fos = new FileOutputStream(Object.class.getResource(conifgName).getFile());
if (value == null || "".equals(value)) {
return null;
}
if (null == instance) {
getInstance();
}
properties.setProperty(key, value);
// 保存,并加入注释
properties.store(fos, "Update '" + key + "'111111 value");
return properties.getProperty(key);
} catch (Exception e) {
log.error("set properties error:(key->" + key + ",value->" + value + ")", e);
e.printStackTrace();
return null;
} finally {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}