Java 如何加载地图<;字符串、集合<;字符串>&燃气轮机;从一个数据文件?

Java 如何加载地图<;字符串、集合<;字符串>&燃气轮机;从一个数据文件?,java,map,properties-file,Java,Map,Properties File,java中是否有一些“本机”格式允许我编写一个数据文件,然后可以轻松地加载到映射中?我宁愿这样做,而不必编写任何重要的解析代码。这将是初始化应用程序范围的bean,因此它在启动时只运行一次 我意识到我可以使用JSON,然后使用GSON之类的东西来加载数据,但这对于看似简单的东西来说似乎有些过分。如果我有闭包,我可以潜在地将其创建为属性文件,为我的集合使用特定的分隔符,并在分隔符上进行闭包解析,但这似乎不是很优雅,最重要的是在Java 8中不可用 类似地,我可以作为一个简单的属性文件加载,然后复制

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

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

类似地,我可以作为一个简单的属性文件加载,然后复制到一个映射中,解析各个属性值,但同样有点“黑客”

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


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

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

ObjectMapper mapper=new ObjectMapper();
Map Map=mapper.readValue(inputStream,
新类型引用(){});
试一试。它使用起来非常简单

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

....

Prersister persister = new Persister();
File file = new File("/file_path");
persister.write(somethingToPersist,file)
@默认值
把一些东西映射到拓荒者;
....
Prersister persister=新的persister();
File File=新文件(“/File_path”);
persister.write(somethingToPersist,文件)

如果您对具有特殊含义的前导选项卡感到满意,我想我会将我的文件格式化为:

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=newlinkedhashmap();
}
公共地图getMap()
{
返回图;
}
公共无效添加行(字符串行)
{
if(line.length()>0)
{
如果(行字符(0)='\t')
{
if(col==null)
{
抛出新的IllegalArgumentException(
“未指定密钥”);
}
列添加(行子字符串(1));
}
其他的
{
col=新的ArrayList();
地图。放置(线、柱);
}
}
}
公共静态映射getMap(文件,
字符集(Charset)抛出IOException
{
MapBuilder mb=新的MapBuilder();
BufferedReader br=新的BufferedReader(新的InputStreamReader(
新文件输入流(文件,字符集));
尝试
{
弦线;
而((line=br.readLine())!=null)
{
mb.addLine(行);
}
返回mb.getMap();
}
最后
{
尝试
{
br.close();
}
捕获(可丢弃的t)
{
t、 printStackTrace();
}
}
}
}
用法:

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

没有这样的事情。使用像JSON或XML这样的标准格式。至于overkill注释:是的,JSON对于
String->Collection
“overkill”来说是“overkill”,但您是否愿意使用一种格式,另一种格式用于字符串列表,另一种格式用于int列表,另一种格式用于
String->String
的映射,等等?为什么XML会过度kill?它由Java直接支持SE@GlennLaneXML是b/c中的一种技术,它使XML文件的编码变得更加复杂。从理论上讲,要正确地执行此操作,需要创建一个XSD(或者至少创建一个DTD),然后编写XML。尽管对于这样的东西,它仍然相当简单,但仅仅制作一张地图似乎有点过分。希望得到更简单的东西。以前从未听说过SimpleXML。谢谢你的链接。然而,我对任何XML的问题是,对于如此简单的东西来说,它非常冗长。另外,正确地执行该操作意味着一个DTD或XSD文件,这会使它更加详细。@Eric B:XML可以是详细的,但是对于这个用例(序列化/反序列化),您甚至不需要查看它,所以。。。谁在乎呢?创意解决方案的全部功劳。也感谢您在编写代码方面所做的努力!但我想我会坚持使用JSON和Jackson,然后为所有目的编写自己的解析器。经过一些思考,我意识到我已经生成了JSON输出,所以我的应用程序已经与Jackson捆绑在一起了。我可能只会使用ObjectMapper加载一个JSON格式的文件并完成它。
Map<String, Collection<String>> myMap = MapBuilder.getMap(
        new File("C:/myfile.txt"), Charset.forName("US-ASCII"));