java读取yaml文件

文章目录

yaml介绍

YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

文件格式
多行缩进
数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:

house:
  family:
    name: Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

字串不一定要用双引号标识;
在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
允许在文件中加入选择性的空行,以增加可读性;
在一个档案中,可同时包含多个文件,并用“——”分隔;
选择性的符号“…”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。
单行缩写
YAML也有用来描述好几行相同结构的数据的缩写语法,数组用’[]‘包括起来,hash用’{}'来包括。因此,上面的这个YAML能够缩写成这样:

house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

使用方法

首先引入yaml的jar ,如果是maven项目,则需要在pom.xml文件中添加

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

代码示例

public class YmlUtil {
	protected String yml = null;
	private Logger logger = LogManager.getLogger(YmlUtil.class);
 
	public YmlUtil(String yml) {
		this.yml = yml;
	}
	
	public Object getYml(String path) {
 
		Yaml yaml = new Yaml();
		URL url = YmlUtil.class.getClassLoader().getResource(yml);
		if (url != null) {
			Map map;
			try {
				map = (Map) yaml.load(new FileInputStream(url.getFile()));
				return getValue(map, path);
			} catch (FileNotFoundException e) {
 
				logger.info("can not find the yml file, please double check");
				return null;
			}
 
		} else {
			return null;
		}
	}
 
	@SuppressWarnings("rawtypes")
	public static Object getValue(Map map, String value) {
		String[] values = value.split("\\.");
		Map m = map;
		int len = values.length - 1;
		for (int i = 0; i < len; i++) {
			if (m.containsKey(values[i])) {
				m = (Map) m.get(values[i]);
			} else {
				return null;
			}
		}
		return m.get(values[len]);
	}
 
}
发布了44 篇原创文章 · 获赞 0 · 访问量 1010

猜你喜欢

转载自blog.csdn.net/LTC_1234/article/details/104220768