Как записать файл YAML с помощью SnakeYaml?

Рассмотрим следующий код:

public static void dumpObjectToYaml(String key, Object O, String path) throws IOException
{
    Map<String, Object> data = new HashMap<>();
    data.put(key, O);

    File F = new File(path);
    F.mkdirs();
    F.createNewFile();

    //write data to File
}

Этот метод направлен на запись данного объекта O с заданным ключом в файл YAML по заданному пути. (если он не существует, он создается.) Но очевидно, что основная часть все еще отсутствует.

Теперь, следуя документации SnakeYaml, для создания YAML мне нужно только создать map и вставил в Объекты нужные клавиши, что я и сделал.

Но нигде (по крайней мере я не вижу) не описано как создать yaml файл по определенному пути!

Единственное, что я нашел, это:

"Метод Yaml.dump(данные объекта) принимает объект Java и создает документ YAML"

public void testDump() 
{
    Map<String, Object> data = new HashMap<String, Object>();
    data.put("name", "Silenthand Olleander");
    data.put("race", "Human");
    data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
    Yaml yaml = new Yaml();
    String output = yaml.dump(data);
    System.out.println(output);
}

а также

"Yaml.dump(данные объекта, выходные данные Writer) запишет созданный документ YAML в указанный файл/поток."

public void testDumpWriter() 
{
   Map<String, Object> data = new HashMap<String, Object>();
   data.put("name", "Silenthand Olleander");
   data.put("race", "Human");
   data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
   Yaml yaml = new Yaml();
   StringWriter writer = new StringWriter();
   yaml.dump(data, writer);
   System.out.println(writer.toString());
}

Но тем не менее, даже несмотря на то, что во втором фрагменте кода именно это и сказано, похоже, что он не поддерживает манипуляции с определенным файлом, и уж точно не показано, как это делать.

Мне кажется, или документация кажется очень загадочной и конкретной? Половина — про специальные приложения, о которых я даже не слышал. Я чувствую себя очень глупо, просто глядя на это, и это немного злит меня.

Во всяком случае; Я был бы очень признателен за любую помощь, которую вы могли бы мне дать.


person Jonas Bartkowski    schedule 25.07.2014    source источник


Ответы (3)


Если я понял вопрос, похоже, он не имеет ничего общего с YAML или SnakeYAML как таковыми, а связан с тем, как вы пишете в определенный файл на Java. По сути, второй пример, который вы скопировали, показывает, как сбросить объект в произвольный java.io.Writer (хотя они используют StringWriter, так как это ничего не запишет на диск). Если вы хотите изменить этот пример для записи в определенный файл, вы можете сделать это, используя FileWriter, например:

public void testDumpWriter() {
   Map<String, Object> data = new HashMap<String, Object>();
   data.put("name", "Silenthand Olleander");
   data.put("race", "Human");
   data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });

   Yaml yaml = new Yaml();
   FileWriter writer = new FileWriter("/path/to/file.yaml");
   yaml.dump(data, writer);
}

Который выгрузит карту data в файл YAML. Обратите внимание, что обычно нет необходимости создавать файл самостоятельно перед открытием FileWriter, так как FileWriter сделает это за вас.

person ig0774    schedule 25.07.2014
comment
Спасибо (: Это было именно то, что я искал. - person Jonas Bartkowski; 25.07.2014
comment
Но теперь у меня другая проблема. Когда я делаю только первые два data.put(), я получаю это: {race: Human, name: Silenthand Olleander} в YAML. Только если я добавлю третий пут, я получаю: черты: [ОДНА_РУКА, ОДИН_ГЛАЗ] раса: Человеческое имя: Молчаливый Олеандр, как и должно быть. У вас есть идеи, почему это так? - person Jonas Bartkowski; 25.07.2014
comment
Это все еще правильно, так как я могу прочитать правильные значения из соответствующих полей, но этот макет менее удобочитаем, чем когда каждое значение имеет свою собственную строку. Я предполагаю, что это делается для того, чтобы сделать документы более компактными, но я бы предпочел иметь возможность изменить это. - person Jonas Bartkowski; 25.07.2014
comment
Здесь не так много места для объяснений, но вы можете принудительно указать элемент в каждой строке, создав объект DumperOptions и настроив его на использование FlowStyle.BLOCK. См. код от testDumperOptionsFlowStyle()< /a> для примера. - person ig0774; 25.07.2014
comment
как сбросить объект (не карту) в yaml? - person dmitryvim; 14.02.2017

Чтобы красиво напечатать в ожидаемом формате yaml (без фигурных скобок, как в принятом ответе):

public static void saveYamlToFile(final Object object) throws IOException {
    final DumperOptions options = new DumperOptions();
    options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
    options.setPrettyFlow(true);
    final Yaml yaml = new Yaml(options);

    final FileWriter writer = new FileWriter("/path/to/file.yaml");
    yaml.dump(object, writer);
}
person Herberts Markūns    schedule 10.06.2020

Еще один способ записи данных

 Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");

        YamlWriter writer = new YamlWriter(new FileWriter("test.yml"));
        writer.write(map);
        writer.close();

Выход:

  key1: value1
  key2: value2
  key3: value3

Для меня в этом случае я вижу более читаемый вывод. Из первого решения мы увидим такой вывод:

{key1: value1, key2: value2, key3: value3}

Если у нас будет много данных, их будет трудно читать

P.S. нам нужна некоторая зависимость

    <dependency>
        <groupId>com.esotericsoftware.yamlbeans</groupId>
        <artifactId>yamlbeans</artifactId>
        <version>1.13</version>
    </dependency>
person Aliaksandr Kavalenka    schedule 12.09.2019