私のプログラムでは、プロパティファイルからキーを読み取り、キーに関連付けられた値のリストを読み取ります。
最近、私はそのようにしようとしていました
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
は、同じキーに対して3つの値を与えます。
あなたのロジックには欠陥があります...基本的に、あなたは以下をする必要があります:
ステップ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();
}
}
次に、ランナークラスでMMLPropertiesをAutowireします
@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);
}
}
}
お役に立てれば