转自:http://mov-webhobo.iteye.com/blog/1786416
项目中一般会有多个配置properties文件,写了一个读取的工具类,见类图和代码
类说明:
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);
- }
- }