gpt4 book ai didi

java - 使用带有变量的配置/属性文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:03 25 4
gpt4 key购买 nike

我使用像这样的简单文本文件

BMG-P   (someLongComplicatedExpression)(.*P)
BMG T (someLongComplicatedExpression)(.*[Tt])
BMG MPA (someLongComplicatedExpression)(.*MPA)

配置我的应用程序(使用 bufferedReader.readLine().split("\t") 进行简单导入)。困扰我的是冗余

我正在考虑这样的解决方案:

%s=(someLongComplicatedExpression)
BMG-P %s(.*P)
BMG T %s(.*[Tt])
BMG MPA %s(.*MPA)

我在其中读取变量的值(例如 %s),然后在导入后替换它们在字符串中出现的位置。

我的问题是:

  • 您知道哪些替代方法?
  • 在代码中实现变量替换的简单方法是什么?
  • 您能给我指出任何支持此类属性文件的框架吗?

最佳答案

我为 Java Properties 类编写了这个简单的扩展:

import java.io.Serializable;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Allows properties to contain expansions of the form ${propertyName}. This
* class makes no attempt to detect circular references, so be careful.
*/
public class ExpandingProperties extends Properties implements PropertySource {

private static final long serialVersionUID = 259782782423517925L;
private final Expander expander = new Expander();

@Override
public String getProperty(String key) {
return expander.expand(super.getProperty(key), this);
}
}

class Expander implements Serializable {

private static final long serialVersionUID = -2229337918353092460L;
private final Pattern pattern = Pattern.compile("\\$\\{([^}]+)\\}");

/**
* Expands variables of the form "${variableName}" within the
* specified string, using the property source to lookup the
* relevant value.
*/
public String expand(final String s, final PropertySource propertySource) {
if (s == null) {
return null;
}
final StringBuffer sb = new StringBuffer();
final Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
final String variableName = matcher.group(1);
final String value = propertySource.getProperty(variableName);
if (value == null) {
throw new RuntimeException("No property found for: " + variableName);
}
matcher.appendReplacement(sb, value.replace("$", "\\$"));
}
matcher.appendTail(sb);
return sb.toString();
}
}

interface PropertySource {

String getProperty(String key);
}

使用示例:

public static void main(String[] args) {
Properties properties = new ExpandingProperties();
properties.put("myVar", "myLongExpression");
properties.put("foo", "${myVar}_1");
properties.put("bar", "${foo}_abc");

System.out.println(properties.getProperty("bar"));
}

打印:

myLongExpression_1_abc

由于 ExpandingPropertiesProperties 的扩展,它继承了所有用于从属性文件加载值的 load...() 方法。

替代方案是 EProperties它与上面的代码做了类似的事情,但更进一步,允许您嵌套属性文件等。我发现它对于我所需要的东西来说太过分了。

关于java - 使用带有变量的配置/属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com