
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. 掃描關注

