1

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

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

同样,我可以作为一个简单的属性文件加载,然后复制到解析单个属性值的 Map 中,但似乎又有点“hacky”。

我可以使用 XML,然后导入 XML,但这太过分了,我宁愿使用易于理解的简单文本格式。

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

4

3 回答 3

1

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

ObjectMapper mapper = new ObjectMapper();

Map<String, List<String>> map = mapper.readValue(inputStream,
     new TypeReference<Map<String, Object>>() {});
于 2013-11-13T16:32:49.307 回答
1

试一试SimpleXML。它非常容易使用。

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

....

Prersister persister = new Persister();
File file = new File("/file_path");
persister.write(somethingToPersist,file)
于 2013-11-13T16:40:06.720 回答
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"));
于 2013-11-13T23:06:24.980 回答