由于eproperties是有点不维护和commonsconfiguration依赖于日志logging(具有讽刺意味的是你不能用它来configuration日志logging)我使用这个代码片段,只需要commons-lang(3)加载插值的属性:
@SuppressWarnings("serial") public static Map loadPropertiesMap(InputStream s) throws IOException { final Map ordered = new LinkedHashMap(); //Hack to use properties class to parse but our map for preserved order Properties bp = new Properties() { @Override public synchronized Object put(Object key, Object value) { ordered.put((String)key, (String)value); return super.put(key, value); } }; bp.load(s); final Map resolved = new LinkedHashMap(ordered.size()); StrSubstitutor sub = new StrSubstitutor(new StrLookup() { @Override public String lookup(String key) { String value = resolved.get(key); if (value == null) return System.getProperty(key); return value; } }); for (String k : ordered.keySet()) { String value = sub.replace(ordered.get(k)); resolved.put(k, value); } return resolved; }
input :
blah=${user.dir} one=1 two=2 five=5 fifteen=${one}${five} twoonefive=${two}${fifteen} six=6
输出 :
blah=/current/working/dir one=1 two=2 five=5 fifteen=15 twoonefive=215 six=6
很明显Map如果你需要的话Map你可以将Map转换回一个Properties对象。 我根据先前声明的属性和系统属性来parsing,但是您可以明显地在StrSubstitutor.lookup调整它。