【发布时间】:2020-05-04 11:10:17
【问题描述】:
如何在 Java 中将属性文件加载到 Property 对象中并解析属性值(${x} 被替换为 ant 属性)?例如使用这个属性文件:
foo=1
bar=${foo}.0
我需要将bar 属性设为1.0 而不是${foo}.0。有什么简单的方法吗?
编辑: Alex 的解决方案适用于简单的场景。就我而言,我必须解决导致这个问题的另一个问题:Pulling values from a Java Properties file in order?。
用于加载和解析属性的示例代码:
import java.util.*;
import java.io.*;
import org.apache.commons.text.StringSubstitutor;
public class Prop {
Properties parsedProperties = null;
public static Properties parseProperties(String filename) {
// inner helper class keeping order of properties:
class LinkedProperties extends Properties {
private static final long serialVersionUID = 1L;
private final HashSet<Object> keys = new LinkedHashSet<Object>();
public LinkedProperties() {
}
public Iterable<Object> orderedKeys() {
return Collections.list(keys());
}
public Enumeration<Object> keys() {
return Collections.<Object>enumeration(keys);
}
public Object put(Object key, Object value) {
keys.add(key);
return super.put(key, value);
}
}
LinkedProperties result = new LinkedProperties();
try (InputStream input = new FileInputStream(filename)) {
result.load(input);
@SuppressWarnings("unchecked")
StringSubstitutor sub = new StringSubstitutor((Map) result);
for (Object k : result.orderedKeys()) {
result.setProperty((String)k, sub.replace(result.getProperty((String)k)));
}
} catch (IOException ex) { ex.printStackTrace(); }
return ((Properties)result);
}
public static void main(String[] args) {
Prop app = new Prop();
// test - write sample properties file:
try {
PrintWriter writer = new PrintWriter(new FileWriter("config.properties"));
writer.println("foo=1");
writer.println("bar=1.${foo}");
writer.println("baz=${bar}.0");
writer.println("xxx=V.${baz}");
writer.close();
} catch (IOException ex) { ex.printStackTrace(); }
// read and parse properties:
app.parsedProperties = parseProperties("config.properties");
// debug print:
for (Object k : app.parsedProperties.keySet()) {
System.out.println((String)k + " = " + app.parsedProperties.getProperty((String)k));
}
}
}
【问题讨论】:
-
Spring 有这个,但不确定在不拉动大量其他 Spring 功能依赖项的情况下获得它有多容易
-
谢谢。 Ant 有这个,但是这里同样适用,如何避免从 ant Project 等中拉出一大堆依赖项?
标签: java properties ant