1. 程式人生 > >java 讀寫 yaml 檔案

java 讀寫 yaml 檔案

簡介

Yaml是一種“是一個可讀性高並且容易被人類閱讀,容易和指令碼語言互動,用來表達資料序列的程式語言。”類似於XML但比XML更簡潔,適合編寫配置檔案。

基本語法規則

  • 大小寫敏感
  • 使用縮排表示層級關係
  • 縮排時不允許使用Tab鍵,只允許使用空格
  • 縮排的空格數目不重要,只要相同層級的元素左側對齊即可

支援的資料結構

  • 物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)
  • 陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值

物件(鍵值對)

物件的一組鍵值對,使用冒號結構表示:

animal: pets

陣列

一組連詞線開頭的行,構成一個數組:

- Cat
- Dog
- Goldfish

純量

純量是最基本的、不可再分的值:

  • 字串
  • 布林值
  • 整數
  • 浮點數
  • Null
  • 時間
  • 日期

數值直接以字面量的形式表示:

number: 12.30

布林值用true和false表示:

isSet: true

時間採用 ISO8601 格式:

iso8601: 2001-12-14t21:59:43.10-05:00 

日期採用複合 iso8601 格式的年、月、日表示:

date: 1976-07-31

字串預設不使用引號表示:

str: 這是一行字串

如果字串之中包含空格或特殊字元,需要放在引號之中:

str: '內容: 字串'

單引號和雙引號都可以使用,雙引號不會對特殊字元轉義:

s1: '內容\n字串'
s2: "內容\n字串"

YAML 允許使用兩個感嘆號,強制轉換資料型別:

e: !!str 123
f: !!str true

複合結構

物件和陣列可以結合使用,形成複合結構:

languages:
 - Ruby
 - Perl
 - Python 
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl
.org

java 操作 yaml 檔案

java 中用封裝好的類庫 org.yaml.snakeyaml.Yaml 操作yaml。

載入yaml 檔案,讀取內容

public void load() throws FileNotFoundException{
  //初始化Yaml解析器
  Yaml yaml = new Yaml();
  File f=new File("test.yaml");
  //讀入檔案
  // load方法支援String,InputStream,Reader作為輸入
  Object result= yaml.load(new FileInputStream(f));
  System.out.println(result.getClass());
  System.out.println( result);
}

test.yaml 檔案內容

a: 1
b: 2

輸出

class java.util.LinkedHashMap
{a=1, b=2}

一個yaml檔案中可以存入多組配置並使用loadAll進行讀取,多組之間使用三個橫槓分開

 public void loadall() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        File f = new File("test.yaml");
        Iterable<Object> result = yaml.loadAll(new FileInputStream(f));
        for (Object obj : result) {
            System.out.println(obj.getClass());
            System.out.println(obj);
        }
    }

loadAlll()返回的是一個Iterable,每個物件的解析是在遍歷到的時候進行的是懶載入的。
test.yaml 檔案內容

a: 1
b: 2
---
c: 3

輸出

class java.util.LinkedHashMap
{a=1, b=2}
class java.util.LinkedHashMap
{c=3}