【问题标题】:How do I write to a YAML file using SnakeYaml?如何使用 SnakeYaml 写入 YAML 文件?
【发布时间】:2014-09-16 22:34:43
【问题描述】:

考虑以下代码:

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 文件中。 (如果它不存在,则创建它。)但显然主要部分仍然缺失。

现在跟随the documentation of 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(Object data, Writer output) 会将生成的 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());
}

但是,尽管它在第二段代码中准确地说明了这一点,但它似乎不支持对某个文件的操作,当然也没有显示如何操作。

是只有我一个人,还是文档感觉非常神秘和具体?其中一半是关于我从未听说过的特殊应用。光是看着我就觉得自己很笨,这让我有点生气。

无论如何;如果您能给我任何帮助,我将不胜感激。

【问题讨论】:

    标签: java file output fileoutputstream snakeyaml


    【解决方案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);
    }
    

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

    【讨论】:

    • 谢谢(:这正是我想要的。
    • 但现在我遇到了不同的问题。当我只执行前两个 data.put() 时,我得到:YAML 中的 {race: Human, name: Silenthand Olleander}。只有当我添加第三个 put 时,我才会得到: 特征:[ONE_HAND,ONE_EYE] 种族:人名:Silenthand Olleander 应该是这样。你知道这是为什么吗?
    • 它仍然是“正确的”,因为我可以从它们对应的字段中读取正确的值,但是这种布局比每个值都有自己的行时可读性差。我想这是为了使文档更紧凑,但我希望能够更改它。
    • 这里没有太多的篇幅可以解释,但是您可以通过创建DumperOptions 对象并将其设置为使用FlowStyle.BLOCK 来强制每行显示该项目。有关此示例,请参见代码 from testDumperOptionsFlowStyle()。
    • 如何将对象(不是映射)转储到 yaml?
    【解决方案2】:

    另一种写入数据的方式

     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}
    

    如果我们有很多数据,就会很难阅读

    附:我们需要一些依赖

        <dependency>
            <groupId>com.esotericsoftware.yamlbeans</groupId>
            <artifactId>yamlbeans</artifactId>
            <version>1.13</version>
        </dependency>
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-11
        • 2015-08-31
        • 2013-02-08
        • 2020-03-12
        • 2012-11-10
        • 2018-12-13
        • 2014-02-04
        • 2014-10-11
        • 2018-12-26
        相关资源
        最近更新 更多