180619-Yaml文件語法及讀寫小結

logo

Yaml文件小結

Yaml文件有本身獨立的語法,經常使用做配置文件使用,相比較於xml和json而言,減小不少沒必要要的標籤或者括號,閱讀也更加清晰簡單;本篇主要介紹下YAML文件的基本語法,以及如何在Java中實現讀寫邏輯java

<!--more-->git

I. 基本語法

  • 使用空格 Space 縮進表示分層,不一樣層次之間的縮進可使用不一樣的空格數目,可是同層元素必定左對齊,即前面空格數目相同(不要使用tab)
  • # 表示單行註釋
  • 破折號後面跟一個空格(a dash and space)表示列表
  • 用冒號和空格表示鍵值對 key: value
  • 簡單數據(scalars,標量數據)能夠不使用引號括起來,包括字符串數據
  • 用單引號或者雙引號括起來的被看成字符串數據,在單引號或雙引號中使用C風格的轉義字符

1. 數組寫法

一個簡單的數組,用-來列出便可,以下github

- apple
- orange
- banana

2. 對象

一個簡單的kv對象json

fruit:
  name: banana
  amount: 3
  price: 4.99

加載後數據結構以下:數組

1

3. 對象數組

首先大結構是數組,可是數組內部是一個kv結構的對象數據結構

-
  name: apple
  price: 1.23
-
  name: orange
  price: 1.33
-
  name: banana
  price: 2.33

加載後數據結構以下:app

2

4. 數組對象

首先大結構是對象,對象內部的成員是數組maven

name:
  - apple
  - orange
  - banana
price:
  - 4.99
  - 2.34
  - 3.99

加載後數據結構以下:學習

3

5. 多維數組

- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]

用中括號包括起來,造成一個二維數組,加載後的數據結構以下測試

image

6. 對象的擴展寫法

對於kv結構的對象,支持經過大括號的方式來替代,簡化配置文件的行數

love: {name: apple, price: 2.99}
hite: {name: orange, price: 1.99}

image

上面的配置,等同於

love:
  name: apple
  price: 2.99
hite:
  name: orange
  price: 1.99

II. YAML文件讀寫

在Java生態環境中,讀寫YAML文件算是比較簡單的一個事情了,一個是本身讀取文件,而後按照語法進行解析(屬於本身造輪子);另一個就是利用開源庫來讀寫,這裏固然是選擇已經頗爲完善的開源庫來處理了

1. 依賴

pom文件中添加maven依賴,版本號查詢最新的便可

<dependency>
  <groupId>org.yaml</groupId>
  <artifactId>snakeyaml</artifactId>
  <version>1.17</version>
</dependency>

2. 封裝類

public class YamlUtil {
    public static InputStream loadStream(String path) throws IOException {
        if (path.startsWith("http")) {
            URL url = new URL(path);
            return url.openStream();
        } else if (path.startsWith("/")) {
            return new FileInputStream(path);
        } else {
            return YamlUtil.class.getClassLoader().getResourceAsStream(path);
        }
    }

    public static <T> T loadConf(String path, Class<T> clz) throws IOException {
        try (InputStream inputStream = loadStream(path)) {
            Yaml yaml = new Yaml();
            return yaml.loadAs(inputStream, clz);
        }
    }

    public static <T> void dumpConf(String save, T obj) throws IOException {
        Yaml yaml = new Yaml();
        yaml.dump(obj, new BufferedWriter(new FileWriter(save)));
    }
}

實現比較簡單了,直接利用 Yaml對象的 loadAs/dump 方法便可,對於測試用例,前面的截圖已經給出,再也不贅述

III. 其餘

0. 小結

核心語法:

  • 使用空格 Space 縮進表示分層,不一樣層次之間的縮進可使用不一樣的空格數目,可是同層元素必定左對齊,即前面空格數目相同(不要使用tab)
  • # 表示單行註釋
  • 破折號後面跟一個空格表示列表
  • 用冒號和空格表示鍵值對 key: value
  • 簡單數據能夠不使用引號括起來,包括字符串數據
  • 用單引號或者雙引號括起來的被看成字符串數據,在單引號或雙引號中使用C風格的轉義字符

轉義demo:

comment: '#'
skip: "abc\n123"

對應測試用例及輸出

@Test
public void testYamlUtil() throws IOException {
    TC map = YamlUtil.loadConf("test.yml", TC.class);
    System.out.println(map);
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class TC {
    private String comment;
    private String skip;
}

輸出結果

YamlUtilTest.TC(comment=#, skip=abc
123)

1. 一灰灰Bloghttps://liuyueyi.github.io/he...

一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛

2. 聲明

盡信書則不如,已上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

3. 掃描關注

blogInfoV2.png

相關文章
相關標籤/搜索