Java 属性文件,其中列表作为单个键的值

Java 属性文件,其中列表作为单个键的值,java,collections,map,properties,set,Java,Collections,Map,Properties,Set,对于我的程序,我想从属性文件中读取一个键以及该键的相关值列表。 最近我就是这样尝试的 public static Map<String,List<String>>categoryMap = new Hashtable<String, List<String>>(); Properties prop = new Properties(); try { prop2.load(new FileInputStrea

对于我的程序,我想从属性文件中读取一个键以及该键的相关值列表。
最近我就是这样尝试的

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键应该有一个包含
[苹果、字母表、蚂蚁]
的列表,B键包含
[蝙蝠、球、巴士]

所以地图应该是这样的{A=[APPLE,ALPHABET,ANT],B=[BAT,BALL,BUS]}但是我得到了
{A=[ANT],B=[BUS]}

我在网上搜索了这种方法,但什么也没找到。我希望有办法。
有什么帮助吗?

围绕属性创建一个包装器,并假设您的a值具有键a.1、a.2等。然后,当要求提供a时,您的包装器将读取所有a.*项并构建列表。Hth

< P>如果这是对某些配置文件的处理,请考虑使用Apache配置。 它可以将多个值转换为一个键,但格式有点不同


key=value1、value2、value3
针对同一个键给出三个值。

尝试将属性写成逗号分隔的列表, 然后在加载属性文件后拆分该值。 比如说

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

如果在值中使用逗号,也可以使用该方法使用和更改值分隔符。

您的逻辑有缺陷。。。基本上,您需要:

  • 获取密钥的列表
  • 如果列表为空,则创建一个新列表并将其放入映射中
  • 将单词添加到列表中
  • 你没有做第二步

    以下是您需要的代码:

    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());
    }
    
    Properties prop=新属性();
    加载(新文件输入流(“/displayCategerization.properties”);
    对于(Map.Entry:prop.entrySet())
    {
    List categoryList=categoryMap.get((String)entry.getKey());
    if(categoryList==null)
    {
    categoryList=新的ArrayList();
    LogDisplayService.categoryMap.put((字符串)entry.getKey(),categoryList);
    }
    add((String)entry.getValue());
    }
    

    还要注意迭代映射/属性项的“正确”方法-通过其
    entrySet()

    逗号分隔列表选项是最简单的,但如果值可能包含逗号,则会变得很有挑战性

    下面是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;
    }
    
    for(字符串值:getPropertyList(prop,“a”))
    {
    系统输出打印项次(值);
    }
    公共静态列表getPropertyList(属性、字符串名称)
    {
    列表结果=新建ArrayList();
    对于(Map.Entry:properties.entrySet())
    {
    if(((字符串)entry.getKey()).matches(“^”+Pattern.quote(name)+“\\.\\d+$”)
    {
    add((字符串)entry.getValue());
    }
    }
    返回结果;
    }
    
    可能还有另一种或更好的方法。但这就是我在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;
        }
    }
    
    MMLProperty类

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

    希望这有助于

    属性仅支持“键,值”对。当有多行具有相同的键时,最后一行获胜(即使这样也可能出现“未定义”的行为)。这就是你输入到categoryMap的内容和你想象的不一样。我建议你写一个小的‘junit’测试。答案很好。我在考虑拥有一个xml文件,然后编写大量代码对其进行解析并存储其中的对象。使用Apache配置的一行程序2:
    新的DefaultListDelimiterHandler(',')。拆分(“a,b,c,true)
    提供了一个
    “a”,“b”,“c”
    列表。Javadoc:
    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();
        }
    }
    
    @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);
            }
        }
    }