如何使用SnakeYaml写入YAML文件?

2022-09-03 18:26:39

请考虑以下代码:

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,我只需要创建一个地图,并在正确的键处放入对象,我就是这样做的。

但是没有任何地方(至少我没有看到它)描述了如何在某个路径上创建yaml文件!

我唯一发现的是:

“Yaml.dump(Object data) 方法接受一个 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(对象数据,写入器输出)会将生成的 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());
}

但是,即使它在第二段代码中完全说明了这一点,它似乎也不支持对某个文件的操作,并且肯定没有显示如何执行此操作。

是只有我,还是文档感觉非常隐晦和指定?其中一半是关于我从未听说过的特殊应用。光是看着它,我就觉得自己真的很傻,这让我有点生气。

无论如何;我真的很感激你能给我的任何帮助。


答案 1

如果我理解了这个问题,它似乎与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);
}

这会将映射转储到 YAML 文件。请注意,在打开 as will 为您处理之前,通常不需要自己创建文件。dataFileWriterFileWriter


答案 2

以预期的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);
}