1. Overview

In this article, we'll learn about breaking YAML strings over multiple lines.

In order to parse and test our YAML files, we'll make use of the SnakeYAML library.

2. Multi-Line Strings

Before we begin, let's create a method to simply read a YAML key from a file into a String:

String parseYamlKey(String fileName, String key) {
    InputStream inputStream = this.getClass()
      .getClassLoader()
      .getResourceAsStream(fileName);
    Map<String, String> parsed = yaml.load(inputStream);
    return parsed.get(key);
}

In the next subsections, we'll look over a few strategies for splitting strings over multiple lines.

We'll also learn how YAML handles leading and ending line breaks represented by empty lines at the beginning and end of a block.

3. Literal Style

The literal operator is represented by the pipe (“|”) symbol. It keeps our line breaks but reduces empty lines at the end of the string down to a single line break.

Let's take a look at the YAML file literal.yaml:

key: |
  Line1
  Line2
  Line3

We can see that our line breaks are preserved:

String key = parseYamlKey("literal.yaml", "key");
assertEquals("Line1\nLine2\nLine3", key);

Next, let's take a look at literal2.yaml, which has some leading and ending line breaks:

key: |


  Line1

  Line2

  Line3


...

We can see that every line break is present except for ending line breaks, which are reduced to one:

String key = parseYamlKey("literal2.yaml", "key");
assertEquals("\n\nLine1\n\nLine2\n\nLine3\n", key);

Next, we'll talk about block chomping and how it gives us more control over starting and ending line breaks.

We can change the default behavior by using two chomping methods: keep and strip.

3.1. Keep

Keep is represented by “+” as we can see in literal_keep.yaml:

key: |+
  Line1
  Line2
  Line3


...

By overriding the default behavior, we can see that every ending empty line is kept:

String key = parseYamlKey("literal_keep.yaml", "key");
assertEquals("Line1\nLine2\nLine3\n\n", key);

3.2. Strip

The strip is represented by “-” as we can see in literal_strip.yaml:

key: |-
  Line1
  Line2
  Line3

...

As we might've expected, this results in removing every ending empty line:

String key = parseYamlKey("literal_strip.yaml", "key");
assertEquals("Line1\nLine2\nLine3", key);

4. Folded Style

The folded operator is represented by “>” as we can see in folded.yaml:

key: >
  Line1
  Line2
  Line3

By default, line breaks are replaced by space characters for consecutive non-empty lines:

String key = parseYamlKey("folded.yaml", "key");
assertEquals("Line1 Line2 Line3", key);

Let's look at a similar file, folded2.yaml, which has a few ending empty lines:

key: >
  Line1
  Line2


  Line3


...

We can see that empty lines are preserved, but ending line breaks are also reduced to one:

String key = parseYamlKey("folded2.yaml", "key");
assertEquals("Line1 Line2\n\nLine3\n", key);

We should keep in mind that block chomping affects the folding style in the same way it affects the literal style.

5. Quoting

Let's have a quick look at splitting strings with the help of double and single quotes.

5.1. Double Quotes

With double quotes, we can easily create multi-line strings by using “\n“:

key: "Line1\nLine2\nLine3"
String key = parseYamlKey("plain_double_quotes.yaml", "key");
assertEquals("Line1\nLine2\nLine3", key);

5.2. Single Quotes

On the other hand, single-quoting treats “\n” as part of the string, so the only way to insert a line break is by using an empty line:

key: 'Line1\nLine2

  Line3'
String key = parseYamlKey("plain_single_quotes.yaml", "key");
assertEquals("Line1\\nLine2\nLine3", key);

6. Conclusion

In this quick tutorial, we've looked over multiple ways of breaking YAML strings over multiple lines through quick and practical examples.

As always, the code is available over on GitHub.