我创建了一个名为myproperties.properties的属性文件:
test.value1=one
test.value2=two
我读取此文件的java代码如下:
String test = Utility.getInstance().getProperty("test.value1");
其中定义了类实用程序:
public class Utility {
private static Utility _instance = null;
private static Properties properties = new Properties();
static public Utility getInstance(){
if (_instance == null) {
_instance = new Utility();
}
return _instance;
}
private Utility(){
loadUtility();
}
public String getProperty(String tgtPropertyName) {
Object prop = properties.get(tgtPropertyName);
if (prop != null) {
return prop.toString();
} else {
return null;
}
}
private void loadUtility(){
String filename = null;
try{
filename = getClass().getClassLoader().getResource("myproperties").getFile();
InputStream file = new FileInputStream(new File(filename));
properties.load(file);
Iterator iter = properties.keySet().iterator();
while (iter.hasNext()){
System.out.println("FILE LOADED");
}
}catch(Exception e){
}
}
}
此代码正常运行。现在我必须在我的属性文件中添加连接:
test.value3=${test.value1}${test.value2}
这不起作用,因为我的Java代码无法解释$ {}。
例外是:
引起:java.lang.IllegalStateException:流处理程序因以下原因而不可用:对于输入字符串:" $ {test.value1}"
为什么?
答案 0 :(得分:1)
使用以下代码在属性文件
中的type.value3中连接Properties prop=null;
public FileReader FileLoader() throws FileNotFoundException
{
File file=new File("myproperties.properties");
FileReader fileReader=new FileReader(file);
return fileReader;
}
public String propertyLoader(String key) throws IOException
{
FileReader fileReader=FileLoader();
prop=new Properties();
prop.load(fileReader);
String value=prop.getProperty(key);
return value;
}
public void resultWriter() throws IOException
{
String value1=propertyLoader("test.value1");
String value2=propertyLoader("test.value2");
String res=value1+value2;
System.out.println(res);
FileWriter fw=new FileWriter("myproperties.properties");
prop=new Properties();
prop.setProperty("test.value3", res);
prop.store(fw, null);
}
public static void main(String[] args) throws IOException
{
UtilityNew util=new UtilityNew();
util.resultWriter();
System.out.println("Success");
}
答案 1 :(得分:0)
核心Java不支持嵌套属性。您可以做的唯一事情是创建一个类,一旦您将file.properties加载到Properties对象中,该类将解析$ {XXX}值。
或者类型安全库可能对您有用。 https://github.com/lightbend/config。它有很多功能,其中之一就是替换:
替换(" foo":$ {bar}," foo":Hello $ {who})
但是你不再拥有一个键值属性文件,它看起来更像是一个json文件。
答案 2 :(得分:0)
这可能是一个较晚的答案,但有人可能会觉得有用。
您可以编写一个小的实用程序函数,该函数读取属性值,然后迭代替换存在的任何嵌套值 首先搜索您的模式。通过查找属性将其替换为实际值。重复此过程,直到获得最终的字符串。
Properties properties = new Properties();
properties.setProperty("base_url", "http://base");
properties.setProperty("subs_url", "${base_url}/subs");
properties.setProperty("app_download", "apps/download");
properties.setProperty("subs_detail", "${subs_url}/detail/${app_download}");
String input = properties.getProperty("subs_detail");
Pattern pattern = Pattern.compile("\\$\\{.*?\\}"); //change the pattern here to find nested values
while (pattern.matcher(input).find())
{
Matcher match = pattern.matcher(input);
while (match.find())
{
input = input.replace(match.group(), properties.getProperty(match.group().substring(2, match.group().length()-1)));
}
}
System.out.println("final String : " + input); // this prints http://base/subs/detail/apps/download