如何加载Map <string,collection <string =“”>&gt;从数据文件?</string,>

时间:2013-11-13 16:19:03

标签: java map properties-file

java中是否有一些“原生”格式允许我编写一个数据文件然后可以轻松加载到Map<String, Collection<String>>?我宁愿这样做而不必编写任何重要的解析代码。这将初始化一个应用程序范围的bean,因此它只在启动时运行一次。

我意识到我可以使用JSON然后使用像GSON这样的东西来加载数据,但这似乎有些过于简单。如果我有闭包,我可以创建它作为属性文件,为我的集合使用特定的分隔符,并在分隔符上进行闭包解析,但这看起来不是很优雅,最重要的是在Java中不可用8。

类似地,我可以加载为一个简单的属性文件,然后复制到一个解析各个属性值的Map,但是再次看起来有点“hacky”。​​

我可以使用XML然后导入XML,但这样做太过分了,而是希望有一个易于理解的简单文本格式。

我并不反对使用来自Apache Commons或Guava等的东西,但还没有找到任何简单的东西。

3 个答案:

答案 0 :(得分:1)

我的观点是JSON是轻量级和简单的,它的内存表示是地图或数组的映射,似乎适合这项工作。这会将您的整个文件读取到多图(使用Jackson):

ObjectMapper mapper = new ObjectMapper();

Map<String, List<String>> map = mapper.readValue(inputStream,
     new TypeReference<Map<String, Object>>() {});

答案 1 :(得分:1)

SimpleXML一个机会。它的使用非常简单。

@Default
Map<String, Collection<String>> somethingToPersist;

....

Prersister persister = new Persister();
File file = new File("/file_path");
persister.write(somethingToPersist,file)

答案 2 :(得分:1)

如果您对具有特殊含义的前导标签没问题,我想我会将文件格式化为:

key1
    value1-a
    value1-b
key2
    value2-a
key3
    value3-a
    value3-b
    value3-c

前导标签表示字符串是(不是)。

然后是解析器:

public class MapBuilder
{
    private final Map<String, Collection<String>> map;
    private Collection<String> col;

    public MapBuilder()
    {
        map = new LinkedHashMap<String, Collection<String>>();
    }

    public Map<String, Collection<String>> getMap()
    {
        return map;
    }

    public void addLine(String line)
    {
        if (line.length() > 0)
        {
            if (line.charAt(0) == '\t')
            {
                if (col == null)
                {
                    throw new IllegalArgumentException(
                            "No key specified");
                }
                col.add(line.substring(1));
            }
            else
            {
                col = new ArrayList<String>();
                map.put(line, col);
            }
        }
    }

    public static Map<String, Collection<String>> getMap(File file, 
            Charset charset) throws IOException
    {
        MapBuilder mb = new MapBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(file), charset));
        try
        {
            String line;
            while ((line = br.readLine()) != null)
            {
                mb.addLine(line);
            }
            return mb.getMap();
        }
        finally
        {
            try
            {
                br.close();
            }
            catch (Throwable t)
            {
                t.printStackTrace();
            }
        }
    }
}

用法:

Map<String, Collection<String>> myMap = MapBuilder.getMap(
        new File("C:/myfile.txt"), Charset.forName("US-ASCII"));