Yaml文件有本身獨立的語法,經常使用做配置文件使用,相比較於xml和json而言,減小不少沒必要要的標籤或者括號,閱讀也更加清晰簡單;本篇主要介紹下YAML文件的基本語法,以及如何在Java中實現讀寫邏輯java
#
表示單行註釋一個簡單的數組,用-
來列出便可,以下git
- apple
- orange
- banana
複製代碼
一個簡單的kv對象github
fruit:
name: banana
amount: 3
price: 4.99
複製代碼
加載後數據結構以下:json
首先大結構是數組,可是數組內部是一個kv結構的對象數組
-
name: apple
price: 1.23
-
name: orange
price: 1.33
-
name: banana
price: 2.33
複製代碼
加載後數據結構以下:數據結構
首先大結構是對象,對象內部的成員是數組app
name:
- apple
- orange
- banana
price:
- 4.99
- 2.34
- 3.99
複製代碼
加載後數據結構以下:maven
- [apple, 3.88]
- [orange, 3.99]
- [banana, 2.99]
複製代碼
用中括號包括起來,造成一個二維數組,加載後的數據結構以下學習
對於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
複製代碼
在Java生態環境中,讀寫YAML文件算是比較簡單的一個事情了,一個是本身讀取文件,而後按照語法進行解析(屬於本身造輪子);另一個就是利用開源庫來讀寫,這裏固然是選擇已經頗爲完善的開源庫來處理了
pom文件中添加maven依賴,版本號查詢最新的便可
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.17</version>
</dependency>
複製代碼
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 方法便可,對於測試用例,前面的截圖已經給出,再也不贅述
核心語法:
#
表示單行註釋轉義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)
複製代碼
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛
盡信書則不如,已上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激