属性文件中的Java连接

时间:2018-03-05 11:01:15

标签: java properties concatenation

我创建了一个名为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}"

为什么?

3 个答案:

答案 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