Как загрузить карту <String, Collection <String >> из файла данных?
Есть ли какой-то "родной" формат в java, который позволит мне записать файл данных, который я затем смогу легко загрузить в Map<String, Collection<String>>
? Я бы предпочел сделать это без необходимости какого-либо значительного анализа. Это должно было бы инициализировать bean-объект в области приложения, поэтому он запускается только один раз при запуске.
Я понимаю, что могу использовать JSON, а затем использовать что-то вроде GSON для загрузки данных, но это кажется излишним для чего-то, что может показаться простым. Если бы у меня были замыкания, я мог бы потенциально создать его как файл свойств, использовать определенный разделитель для своей коллекции и иметь синтаксический анализ замыкания в этом разделителе, но это не выглядит очень элегантно и, самое главное, недоступно в Java 8.
Точно так же я могу загрузить простой файл свойств, а затем скопировать его на карту, анализируя значения отдельных свойств, но опять-таки кажется немного "хакерским".
Я мог бы использовать XML, а затем импортировать XML, но это слишком излишне, и я бы предпочел простой текстовый формат, который легко понять.
Я не против использования чего-либо из Apache Commons или Guava и т. Д., Но пока не нашел ничего простого.
3 ответа
Мое мнение таково, что JSON легок и прост, его представление в памяти - это карта карт или массивов, кажется, подходит для этой работы. Это прочитало бы весь ваш файл в мультикарту (использует Джексона):
ObjectMapper mapper = new ObjectMapper();
Map<String, List<String>> map = mapper.readValue(inputStream,
new TypeReference<Map<String, Object>>() {});
Дайте SimpleXML шанс. это смехотворно легко в использовании.
@Default
Map<String, Collection<String>> somethingToPersist;
....
Prersister persister = new Persister();
File file = new File("/file_path");
persister.write(somethingToPersist,file)
Если у вас все в порядке с лидирующей вкладкой, имеющей особое значение, думаю, я бы отформатировал мой файл следующим образом:
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"));