
Yaml文件小結
Yaml文件有自己獨立的語法,常用作配置文件使用,相比較於xml和json而言,減少很多不必要的標簽或者括號,閱讀也更加清晰簡單;本篇主要介紹下YAML文件的基本語法,以及如何在Java中實現讀寫邏輯
I. 基本語法
- 使用空格 Space 縮進表示分層,不同層次之間的縮進可以使用不同的空格數目,但是同層元素一定左對齊,即前面空格數目相同(不要使用tab)
 #表示單行注釋- 破折號后面跟一個空格(a dash and space)表示列表
 - 用冒號和空格表示鍵值對 key: value
 - 簡單數據(scalars,標量數據)可以不使用引號括起來,包括字符串數據
 - 用單引號或者雙引號括起來的被當作字符串數據,在單引號或雙引號中使用C風格的轉義字符
 
1. 數組寫法
一個簡單的數組,用-來列出即可,如下
- apple
- orange
- banana
 
        2. 對象
一個簡單的kv對象
fruit:
  name: banana
  amount: 3
  price: 4.99
 
        加載后數據結構如下:

3. 對象數組
首先大結構是數組,但是數組內部是一個kv結構的對象
-
  name: apple
  price: 1.23
-
  name: orange
  price: 1.33
-
  name: banana
  price: 2.33
 
        加載后數據結構如下:

4. 數組對象
首先大結構是對象,對象內部的成員是數組
name:
  - apple
  - orange
  - banana
price:
  - 4.99
  - 2.34
  - 3.99
 
        加載后數據結構如下:

5. 多維數組
- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]
 
         
         
        用中括號包括起來,形成一個二維數組,加載后的數據結構如下

6. 對象的擴展寫法
對於kv結構的對象,支持通過大括號的方式來替代,簡化配置文件的行數
love: {name: apple, price: 2.99}
hite: {name: orange, price: 1.99}
 
        
上面的配置,等同於
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. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明
盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 微博地址: 小灰灰Blog
 - QQ: 一灰灰/3302797840
 
3. 掃描關注

