Файл свойств со списком в качестве значения для отдельного ключа - PullRequest
22 голосов
/ 16 марта 2012

Для моей программы я хочу прочитать ключ из файла свойств и связанный список значений для ключа.
Недавно я пытался вот так

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]}
Я искал в интернете такой способ, но ничего не нашел. Я хотел бы, чтобы был способ. Любая помощь?

Ответы [ 6 ]

36 голосов
/ 16 марта 2012

Попробуйте написать свойства в виде списка через запятую, затем разделите значение после загрузки файла свойств. Например

a=one,two,three
b=nine,ten,fourteen

Вы также можете использовать org.apache.commons.configuration и изменить разделитель значений, используя метод AbstractConfiguration.setListDelimiter (char) , если в своих значениях используется запятая.

11 голосов
/ 06 сентября 2013

Параметр списка, разделенного запятыми, является самым простым, но становится сложным, если значения могут включать запятые.

Вот пример подхода 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;
}
4 голосов
/ 16 марта 2012

Если это для обработки файла конфигурации, рассмотрите возможность использования конфигурации 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 голосов
/ 16 марта 2012

Ваша логика несовершенна ... в основном вам необходимо:

  1. получить список для ключа
  2. , если список нулевой, создать новый список и поместить егона карте
  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().

2 голосов
/ 16 марта 2012

Создайте оболочку вокруг свойств и предположите, что у вашего значения A есть ключи A.1, A.2 и т. Д. Затем, когда вас спросят об A, ваша оболочка прочитает все элементы A. * и создаст список.НТН

1 голос
/ 02 марта 2018

Возможно, есть другой способ или лучше.Но так я делаю это в 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 class.

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 I AutowireMMLProperties

@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);
        }
    }
}

Надеюсь, это поможет

...