属性文件,其中列表作为单个键的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了属性文件,其中列表作为单个键的值相关的知识,希望对你有一定的参考价值。
对于我的程序,我想从属性文件和键的相关值列表中读取一个键。 最近我这样做了
public static Map<String,List<String>>categoryMap = new Hashtable<String, List<String>>();
Properties prop = new Properties();
try {
prop2.load(new FileInputStream(/displayCategerization.properties));
Set<Object> keys = prop.keySet();
List<String> categoryList = new ArrayList<String>();
for (Object key : keys) {
categoryList.add((String)prop2.get(key));
LogDisplayService.categoryMap.put((String)key,categoryList);
}
System.out.println(categoryList);
System.out.println("Category Map :"+LogDisplayService.categoryMap);
keys = null;
prop = null;
} catch (Throwable e) {
e.printStackTrace();
}
和我的属性文件如下 -
A=APPLE
A=ALPHABET
A=ANT
B=BAT
B=BALL
B=BUS
我想要关键A应该有一个包含[APPLE, ALPHABET,ANT]
的列表,B包含[BAT,BALL,BUS]
。
所以地图应该像这个{A=[APPLE, ALPHABET,ANT], B=[BAT,BALL,BUS]}
,但我得到
{A=[ANT], B=[BUS]}
我在互联网上搜索了这样的方式,但一无所获。我希望应该有办法。有帮助吗?
尝试将属性编写为逗号分隔列表,然后在加载属性文件后拆分该值。例如
a=one,two,three
b=nine,ten,fourteen
如果您在值中使用逗号,也可以使用org.apache.commons.configuration并使用AbstractConfiguration.setListDelimiter(char)方法更改值分隔符。
逗号分隔列表选项是最简单的,但如果值可以包含逗号则变得具有挑战性。
以下是a.1,a.2,...方法的示例:
for (String value : getPropertyList(prop, "a"))
{
System.out.println(value);
}
public static List<String> getPropertyList(Properties properties, String name)
{
List<String> result = new ArrayList<String>();
for (Map.Entry<Object, Object> entry : properties.entrySet())
{
if (((String)entry.getKey()).matches("^" + Pattern.quote(name) + "\\.\\d+$"))
{
result.add((String) entry.getValue());
}
}
return result;
}
如果这是用于某些配置文件处理,请考虑使用Apache配置。 https://commons.apache.org/proper/commons-configuration/javadocs/v1.10/apidocs/index.html?org/apache/commons/configuration/PropertiesConfiguration.html它有多个值到单个键的方式 - 格式有点不同
key=value1,value2,valu3
针对相同的密钥给出三个值。
你的逻辑有缺陷......基本上,你需要:
- 获取密钥列表
- 如果列表为null,则创建一个新列表并将其放入映射中
- 将单词添加到列表中
你没有做第2步。
这是你想要的代码:
Properties prop = new Properties();
prop.load(new FileInputStream("/displayCategerization.properties"));
for (Map.Entry<Object, Object> entry : prop.entrySet())
{
List<String> categoryList = categoryMap.get((String) entry.getKey());
if (categoryList == null)
{
categoryList = new ArrayList<String>();
LogDisplayService.categoryMap.put((String) entry.getKey(), categoryList);
}
categoryList.add((String) entry.getValue());
}
还要注意迭代地图/属性条目的“正确”方法 - 通过它的entrySet()
。
创建一个包围属性的包装器并假设您的A值具有键A.1,A.2等。然后当被要求A时,您的包装器将读取所有A. *项并构建列表。 HTH
可能还有另一种方式或更好的方法。但这就是我在Spring Boot中执行此操作的方法。
我的属性文件包含以下行。 “,”是每行的分隔符。
mml.pots=STDEP:DETY=LI3;,STDEP:DETY=LIMA;
mml.isdn.grunntengingar=STDEP:DETY=LIBAE;,STDEP:DETY=LIBAMA;
mml.isdn.stofntengingar=STDEP:DETY=LIPRAE;,STDEP:DETY=LIPRAM;,STDEP:DETY=LIPRAGS;,STDEP:DETY=LIPRVGS;
我的服务器配置
@Configuration
public class ServerConfig {
@Inject
private Environment env;
@Bean
public MMLProperties mmlProperties() {
MMLProperties properties = new MMLProperties();
properties.setMmmlPots(env.getProperty("mml.pots"));
properties.setMmmlPots(env.getProperty("mml.isdn.grunntengingar"));
properties.setMmmlPots(env.getProperty("mml.isdn.stofntengingar"));
return properties;
}
}
MMLProperties类。
public class MMLProperties {
private String mmlPots;
private String mmlIsdnGrunntengingar;
private String mmlIsdnStofntengingar;
public MMLProperties() {
super();
}
public void setMmmlPots(String mmlPots) {
this.mmlPots = mmlPots;
}
public void setMmlIsdnGrunntengingar(String mmlIsdnGrunntengingar) {
this.mmlIsdnGrunntengingar = mmlIsdnGrunntengingar;
}
public void setMmlIsdnStofntengingar(String mmlIsdnStofntengingar) {
this.mmlIsdnStofntengingar = mmlIsdnStofntengingar;
}
// These three public getXXX functions then take care of spliting the properties into List
public List<String> getMmmlCommandForPotsAsList() {
return getPropertieAsList(mmlPots);
}
public List<String> getMmlCommandsForIsdnGrunntengingarAsList() {
return getPropertieAsList(mmlIsdnGrunntengingar);
}
public List<String> getMmlCommandsForIsdnStofntengingarAsList() {
return getPropertieAsList(mmlIsdnStofntengingar);
}
private List<String> getPropertieAsList(String propertie) {
return ((propertie != null) || (propertie.length() > 0))
? Arrays.asList(propertie.split("\\s*,\\s*"))
: Collections.emptyList();
}
}
然后在我的Runner类中,我自动装配MMLProperties
@Component
public class Runner implements CommandLineRunner {
@Autowired
MMLProperties mmlProperties;
@Override
public void run(String... arg0) throws Exception {
// Now I can call my getXXX function to retrieve the properties as List
for (String command : mmlProperties.getMmmlCommandForPotsAsList()) {
System.out.println(command);
}
}
}
希望这可以帮助
以上是关于属性文件,其中列表作为单个键的值的主要内容,如果未能解决你的问题,请参考以下文章
如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件
按对象属性之一的值对对象列表进行排序,其中只有一个值是感兴趣的