java中是否有一些“原生”格式允许我编写一个数据文件然后可以轻松加载到Map<String, Collection<String>>
?我宁愿这样做而不必编写任何重要的解析代码。这将初始化一个应用程序范围的bean,因此它只在启动时运行一次。
我意识到我可以使用JSON然后使用像GSON这样的东西来加载数据,但这似乎有些过于简单。如果我有闭包,我可以创建它作为属性文件,为我的集合使用特定的分隔符,并在分隔符上进行闭包解析,但这看起来不是很优雅,最重要的是在Java中不可用8。
类似地,我可以加载为一个简单的属性文件,然后复制到一个解析各个属性值的Map,但是再次看起来有点“hacky”。
我可以使用XML然后导入XML,但这样做太过分了,而是希望有一个易于理解的简单文本格式。
我并不反对使用来自Apache Commons或Guava等的东西,但还没有找到任何简单的东西。
答案 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"));