如何在java中使用单个管理器类访问多个属性文件

时间:2016-03-24 13:38:44

标签: java file properties

我有大约10个属性文件用于不同目的,我正在为每个文件创建一个新类来访问其中的内容。我在想是否有可能使用像.getValue(key,propertFileName)这样的方法创建一个类。

所以,如果我打电话给.getValue("name.type","sample.properties");

下面是我用来从属性文件中获取值的代码,我正在使用Core Java。

public class PropertiesCache {

    private final Properties configProp = new Properties();

    private PropertiesCache() {
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("sample.properties");
        System.out.println("Read all properties from file");
        try {
            configProp.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static class LazyHolder {
        private static final PropertiesCache INSTANCE = new PropertiesCache();
    }

    public static PropertiesCache getInstance() {
        return LazyHolder.INSTANCE;
    }

    public String getProperty(String key) {
        return configProp.getProperty(key);
    }

    public Set<String> getAllPropertyNames() {
        return configProp.stringPropertyNames();
    }

    public boolean containsKey(String key) {
        return configProp.containsKey(key);
    }
}

通过以下调用,我可以从sample.properties文件中获取值。

PropertiesCache.getInstance().getProperty("name.type");

使用上面的代码,我可以从单个属性文件中获取内容。为了从多个文件中获取值,我应该为每个文件创建一个单独的Cache类。

您能否建议我如何使用单个管理器类从不同的属性文件中获取属性值。

因此.getValue("name.type","sample.properties")应返回与PropertiesCache.getInstance().getProperty("name.type")相同的值。

2 个答案:

答案 0 :(得分:1)

将各种属性对象放在Map中,使用文件名作为键填充,并将属性包作为值读取。

“获取”将遵循:

Map<String, Properties> propsCache = .... // declare and fill elsewhere

public String getProperty(String name, String file) {
    Properties p = propsCache.get(file);
    return p.getProperty(name);
}

...根据需要添加错误处理。

答案 1 :(得分:0)

将所有属性文件加载到Map,然后使用文件名作为键。例如:

public class PropertiesCache
{

    private Map<String, Properties> map = new HashMap<>();

    public PropertiesCache(List<String> filenames)
    {

        for (String f : filenames)
        {
            Properties props = new Properties();
            try
            {
                props.load(new FileReader(f));
                map.put(f, props);
            }
            catch (IOException ex)
            {
                // handle error
            }
        }

    }

    public String getProperty(String file, String key) {

        Properties props = map.get(file);

        if (props != null) {
            return props.getProperty(key);
        }

        return null;
    }

    public Set<String> getAllPropertyNames()
    {

        Set<String> values = new HashSet<>();

        for (Properties p : map.values())
        {
            values.addAll(p.stringPropertyNames());
        }

        return values;

    }

    public boolean containsKey(String key)
    {
        for (Properties p : map.values())
        {
            if (map.containsKey(key))
            {
                return true;
            }
        }

        return false;
    }
}

您可能希望更改方法签名以接受文件名:

public Set<String> getAllPropertyNames(String file)
{

    Properties props = map.get(file);

    if (props != null)
    {
        return props.stringPropertyNames();
    }

    return null;

}

public boolean containsKey(String file, String key)
{
    Properties props = map.get(file);

    if (props != null)
    {
        return props.contains(key);
    }

    return false;
}