本文主要针对新手,提取java配置文件中变量。
项目实际开发的时候,经常遇到需要通过配置文件获取可变变量的开发需求、或者通过外部文件获取sql的开发需求。
原因就不复述了,无非需要脱离开发环境更改变量云云。
本文主要提供两个简单方式:
- 通过工具类:.
优点:通过文件流获取,通俗易懂,代码好移植。
缺点:消耗资源,不适用数据量较大的项目。
- 通过java.util的工具类 ResourceBundle 获取:
优点:java工具类获取,资源消耗小,国际化程度好,代码移植简单等等
缺点:格式要求严格,某些特定场合需要复写底层或重写 ResourceBundle 类方法才能实现。
先说第一种实现:呃。其实没什么可说的 上传一个简单的demo代码吧 需要的小盆友可以直接移植过去,几乎不需要更改。这样也符合看这类文章人群的需求。
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PropertyUtil {
private static final Logger logger = LoggerFactory.getLogger(PropertyUtil.class);
private static Properties props;
// static{
// loadProps();
// }
// private void loadProps(){
// this.loadProps();
// }
synchronized static private void loadProps(String properties){
logger.info("开始加载properties文件内容.......");
props = new Properties();
InputStream in = null;
try {
// 第一种,通过类加载器进行获取properties文件流
in = PropertyUtil.class.getClassLoader().getResourceAsStream(properties);
// <!--第二种,通过类进行获取properties文件流-->
//in = PropertyUtil.class.getResourceAsStream("/jdbc.properties");
props.load(in);
} catch (FileNotFoundException e) {
logger.error("properties文件未找到");
} catch (IOException e) {
logger.error("出现IOException");
} finally {
try {
if(null != in) {
in.close();
}
} catch (IOException e) {
logger.error("properties文件流关闭出现异常");
}
}
logger.info("加载properties文件内容完成...........");
logger.info("properties文件内容:" + props);
}
public static String getProperty(String key,String properties){
if(null == props) {
loadProps(properties);
}
return props.getProperty(key);
}
public static String getProperty(String key, String defaultValue,String properties) {
if(null == props) {
loadProps(properties);
}
return props.getProperty(key, defaultValue);
}
}
把这个类放到工具分类中,下次直接调用即可。
说明一下吧,上述部分是为灵活调用准备的,如果调用文件确定,或可以从静态资源中获取,可以开放static 这样也符合静态类加载原则。在初始化时候加载到jvm中,这样也是一种好习惯。
调用呢,也传一个吧,也方便刚学习的小盆友:
public static void main(String[] args) {
String pro = "context-app.properties";
String key = "jdbc.password";
String s = PropertyUtil.getProperty(key,pro);
System.out.println(s);
}
二、通过util.ResourceBundle调用:
关于ResourceBundle的具体类说明,这里就不再复述了,新接触代码的小盆友可以在其他帖子找一下,基础内容,很好理解。
import java.lang.reflect.Constructor;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class Test {
public static final String PROPERTIES_FILE_NAME = "context-app";
public static final String MY_DRIVER_KEY = "jdbc.driver";//properties: jdbc.driver
public static final String MY_URL_KEY = "jdbc.url";//properties: jdbc.driver
public static final String MY_NAME_KEY = "jdbc.username";//properties: jdbc.name
public static final String MY_PASSWORD_KEY = "jdbc.password";//properties: jdbc.password
private static String myUsername;
private static String myDrider;
static{
try {
ResourceBundle bundle = ResourceBundle.getBundle(PROPERTIES_FILE_NAME, Locale.CHINESE);
myDrider = bundle.getString(MY_DRIVER_KEY);
myUsername = bundle.getString(MY_NAME_KEY).trim();
} catch (Exception e) {
System.err.println( "[Property]:Can't Load property.properties");
myUsername = "default username";
myDrider = "default drider";
System.out.println( "myName will use the default value: " + myUsername);
// e.printStackTrace();
}
}
public static void main(String[] args) {
//基础方法开始(仅供了解方法)
String bun = "context-app";
ResourceBundle bundle = ResourceBundle. getBundle(bun);
String ss = bundle.getString(key);
try {
System.out.println(ss );
} catch (Exception e) {
e.printStackTrace();
}
//基础方法结束
//实际应用(包含静态调用)
Test test;
try {
test = (Test)Class.forName("test.ws.Test").newInstance();//forName方法
test.print();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public void print() {
System.out.println("My name is: " + myUsername);
System.out.println("My value is: " + myDrider);
}
}
Test调用处用了反射,实际直接new也是一样的。
以上,仅供大家参考吧!有问题可以留言!