Как загрузить карту <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"));
Другие вопросы по тегам