項目中一般會有多個配置properties檔案,寫了一個讀取的工具類,見類圖和代碼
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SZxYDM2AjZjJGZycTLxcjZh1yN0Q2MtUjN0IWLyQmZ2cDNjdzLcJDOxIzLcBDOwAzLcRnbl1GajFGd0F2LcRWYvxGc19CXt92YuUWelRXauwGZvw1LcpDc0RHaiojIsJye.jpg)
類說明:
ClassPathPropsReader:class path properties reader
ClassNamePropsReader:按類名查找properties檔案位置,properties檔案名和類名相同、放置在同一個包下
PropsReaderFactory:ClassPathPropsReader靜态工廠方法類
主要代碼:
package properties;
import java.io.IOException;
import java.util.Properties;
/**
* class path properties reader
*
* @author Mov
* @version 1.0 Mov 2013-2-2 下午08:21:38 create
* @see ClassNamePropsReader
* @see PropsReaderFactory
*/
public abstract class ClassPathPropsReader {
private static Properties props;
private void init() {
if (props == null) {
synchronized (this) {
props = new Properties();
try {
String filePath = getFilePath();
props.load(this.getClass().getClassLoader()
.getResourceAsStream(filePath));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 擷取properties檔案路徑
* @return 傳回格式如:com/XXX/YYY/Zzz.properties
*/
protected abstract String getFilePath();
@SuppressWarnings("unchecked")
public final <T> T getProperty(String key, T defaultValue) {
init();
try {
String val = props.getProperty(key, null);
Object ret = null;
if (val == null || "".equals(val)) {
ret = null;
} else if (defaultValue instanceof String) {
ret = val;
} else if (defaultValue instanceof Integer) {
ret = Integer.parseInt(val);
} else if (defaultValue instanceof Boolean) {
ret = val.toLowerCase().equals("true");
} else if (defaultValue instanceof Long) {
ret = Long.parseLong(val);
} else if (defaultValue instanceof Byte) {
ret = Byte.parseByte(val);
} else if (defaultValue instanceof Float) {
ret = Float.parseFloat(val);
} else if (defaultValue instanceof Double) {
ret = Double.parseDouble(val);
} else if (defaultValue instanceof Character) {
ret = val.charAt(0);
} else {
ret = null;
}
return ret != null ? (T) ret : defaultValue;
} catch (RuntimeException e) {
return defaultValue;
}
}
}
package properties;
import java.io.File;
/**
* properties檔案名和類名相同、放置在同一個包下
*
* <pre>
* 如:
* 類全名為a.b.c.Test
* 則properties檔案名為 a\b\c\Test.properties
*
* 此時可以直接繼承{@link #ClassNamePropsReader}
* </pre>
*
* @author Mov
* @version 1.0 Mov 2013-2-2 下午08:23:13 create
*/
public class ClassNamePropsReader extends ClassPathPropsReader {
@Override
protected String getFilePath() {
String fullClassName = this.getClass().getCanonicalName();
return fullClassName.replace('.', File.separatorChar) + ".properties";
}
}
package properties;
import java.util.HashMap;
import java.util.Map;
/**
* ClassPathPropsReader靜态工廠方法類
*
* @author Mov
* @version 1.0 Mov 2013-2-2 下午08:25:24 create
*/
public class PropsReaderFactory {
private static Map<Class<? extends ClassPathPropsReader>, ClassPathPropsReader> readers =
new HashMap<Class<? extends ClassPathPropsReader>, ClassPathPropsReader>();
public static ClassPathPropsReader getInstance(Class<? extends ClassPathPropsReader> cls) {
if (readers.get(cls) == null) {
try {
ClassPathPropsReader reader = cls.newInstance();
readers.put(cls, reader);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return readers.get(cls);
}
}
測試:
package properties;
import properties.xxx.yyy.HelloWorld;
/**
*
* @author Mov
* @version 1.0 Mov 2013-2-2 下午09:03:48 create
*/
public class Test {
public static void main(String[] args) {
ClassPathPropsReader reader = PropsReaderFactory.getInstance(HelloWorld.class);
String str0 = reader.getProperty("str0", "_____");
String str2 = reader.getProperty("str2", "_____");
System.out.println(str0);
System.out.println(str2);
int int0 = reader.getProperty("int0", -1);
int int2 = reader.getProperty("int2", -1);
System.out.println(int0);
System.out.println(int2);
boolean boolean0 = reader.getProperty("boolean0", Boolean.TRUE);
boolean boolean2 = reader.getProperty("boolean2", Boolean.TRUE);
System.out.println(boolean0);
System.out.println(boolean2);
char char0 = reader.getProperty("char0", '_');
System.out.println(char0);
}
}
缺少的檔案在附件中